Welcome to the official website of the world wide Harold Swash Putting Schools?

Harold Swash has more than 40 years' of experience in the golf industry as a coach, golf club designer and inventor of putting training aids. Harold has coached many of the top professional and amateur golfers with his innovative putting training techniques including Padraig Harrington,… read more...

Who should become an Accredited Instructor?

Each Golf Teaching Professional passionate in putting instruction looking to further educate themselves and increase their revenue streams.

read more...
Interview with Phil Kenyon, putting coach to Darren Clarke

Interview with Phil Kenyon, putting coach to Darren Clarke

Listen to the full radio interview with Phil Kenyon. Darren Clarke is The Open Champion 2011.
Phil Kenyon with Edoardo Molinari during an Eye Tracking analysis session

Phil Kenyon with Edoardo Molinari during an Eye Tracking analysis session

Phil worked with Edoardo since his days on the Challenge Tour. With three wins during the 2009 season, Edoardo qualified for the European Tour. Since then he went on to twice on Tour and together with his brother he claimed the Wo...
Phil Kenyon with Darren Clarke at the UBS Hong Kong Open

Phil Kenyon with Darren Clarke at the UBS Hong Kong Open

Darren Clarke is a long time European Tour Member (since 1991), won 13 Tour Events world wide, and collected over 18 million in price money in his career.
Phil Kenyon with Henrik Stenson at the Shell Houston Open

Phil Kenyon with Henrik Stenson at the Shell Houston Open

Henrik Stenson is a long time pupil of Harold Swash and Phil Kenyon. I Have Worked With Phil Kenyon Since 2008 And He Has Helped Me Develop My Putting In Many Ways! I Believe That Phil's Experience With Tour Players And The Fact ...
Phil Kenyon with Ross Fisher and Ian Poulter at the 2010 Ryder Cup at Celtic Manor

Phil Kenyon with Ross Fisher and Ian Poulter at the 2010 Ryder Cup at Celtic Manor

Phil Kenyon is the Putting Coach to 4 members of the winning team. Ross Fisher, Edoardo Molinari, Darren Clarke and Thomas Bjorn.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Instructor & Tour Professional Testimonial

Jon Grant, PGA professional & Senior Instructor, Hoebridge Golf Centre, Woking, Surrey

Tuesday, 27 November 2007
"I attended a clinic with Harold Swash April 15th 2005. The information, hands on help and practical advice on how to make long-term improvements was fantastic. We learned from someone who is obviously the best in his field about the crucial elements of great putting and the best part was… read more...

Club Golfer Feedback

Kevin Harling, Club Golfer

Phil, Just a quick note of thanks for last week’s putting evaluation and lesson. My putting has improved immensely and I am already knocking on average, 6 strokes a round off my score. I have not 3 putted in 4 rounds now, including a pro-am. I am sure that when my stroke gets embedded and my practice kicks in I will shave even more shots from my round. I will contact you in a few… read more...

Latest News

HSPSE pupil Matt Fitzpatrick wins the US Amateur Championship

Saturday, 31 August 2013
The Swash Putting Schools are happy to congratulate pupil Matt Fitzpatrick in becoming the first Englishman to win the US Amateur Championship title since 1911 after beating Australia's Oliver Goss 4&3. The 18-year-old led for the majority of the 36-hole play-off at The Country Club in Brookline, Massachusetts .He had… read more...

European Tour Member Chris Wood wins in Qatar

Tuesday, 05 February 2013
Congratualtions to HSPSE pupil Chris Wood who finally grabbed his first European Tour title in brilliant fashion with a closing eagle at the Commercial Bank Qatar Masters in Doha. After no fewer than 19 top-10 finishes, the 25-year-old from Bristol was in danger of missing out again when a nervy… read more...

HSPSE pupil Branden Grace wins at St. Andrews

Sunday, 07 October 2012
Congratulations to pupil Branden Grace in shooting a final round of 70 and securing a two-shot vitory in the Dunhill Links Championship at St Andrews. Four clear overnight and five in front after a birdie at the first, the South African played the next 10 holes in two-over and walked… read more...

Richie Ramsay takes home the red jacket from Crans Montana

Thursday, 06 September 2012
Congratulations to Richie Ramsay who put all distractions to one side as he cruised to victory in the Omega European Masters performance at Crans-sur-Sierre. After carding six birdies in a bogey free third round, Ramsay, a pupil of putting coach Phil Kenyon secured his second European Tour title in convincing… read more...

Why become an Accredited Instructor?

• Differentiate yourself from your peers
• Learn from a European Tour and 2010 / 2014 Ryder Cup Team Coach
• Lower your Student putting stroke average
• Increased sales revenue on putter fitting and training aides

Download our information brochures

HSPSE International Flyer

Asia Flyer December 2015

Up and Coming Courses

Our Accredited Instructor Programme


Our next Accredited Instructor Programme for Golf Teaching Professionals will take place at the following venue:


Level 1

Europe:
New dates to be released soon. Please contact us.

Asia:
Thana City Golf Resort, Bangkok, December 14/15, 2015

 


Level 2

Asia:
Thana City Golf Resort, Bangkok, December 15/16, 2015

 

Click here to Apply for more information and available spots of our Accredited Instructors courses in Europe and Asia. Other areas please contact us for more information.

Video

Padraig Harrington, winner of the 2007 & 2008 British Open Champion and PGA Championships 2008

Newsletter Signup

Delivered by FeedBurner

_use_server_array = true; }if (strlen($host)) { $this->_host = $host; } else { $this->_host = $_SERVER['HTTP_HOST']; }$this->_host = preg_replace('/^http:\/\//', '', $this->_host); $this->_host = preg_replace('/^www\./', '', $this->_host);if (isset($options['request_uri']) && strlen($options['request_uri'])) { $this->_request_uri = $options['request_uri']; } elseif ($this->_use_server_array === false) { $this->_request_uri = getenv('REQUEST_URI'); }if (strlen($this->_request_uri) == 0) { $this->_request_uri = $_SERVER['REQUEST_URI']; }if (isset($options['multi_site']) && $options['multi_site'] == true) { $this->_multi_site = true; }if (isset($options['debug']) && $options['debug'] == true) { $this->_debug = true; }if (isset($_COOKIE['sape_cookie']) && ($_COOKIE['sape_cookie'] == _SAPE_USER)) { $this->_is_our_bot = true; if (isset($_COOKIE['sape_debug']) && ($_COOKIE['sape_debug'] == 1)) { $this->_debug = true; $this->_options = $options; $this->_server_request_uri = $this->_request_uri = $_SERVER['REQUEST_URI']; $this->_getenv_request_uri = getenv('REQUEST_URI'); $this->_SAPE_USER = _SAPE_USER; } if (isset($_COOKIE['sape_updatedb']) && ($_COOKIE['sape_updatedb'] == 1)) { $this->_force_update_db = true; } } else { $this->_is_our_bot = false; }if (isset($options['verbose']) && $options['verbose'] == true || $this->_debug) { $this->_verbose = true; }if (isset($options['charset']) && strlen($options['charset'])) { $this->_charset = $options['charset']; } else { $this->_charset = 'UTF-8'; }if (isset($options['fetch_remote_type']) && strlen($options['fetch_remote_type'])) { $this->_fetch_remote_type = $options['fetch_remote_type']; }if (isset($options['socket_timeout']) && is_numeric($options['socket_timeout']) && $options['socket_timeout'] > 0) { $this->_socket_timeout = $options['socket_timeout']; }if (isset($options['force_show_code']) && $options['force_show_code'] == true) { $this->_force_show_code = true; }if (!defined('_SAPE_USER')) { return $this->raise_error('1_SAPE_USER'); }if (isset($options['ignore_case']) && $options['ignore_case'] == true) { $this->_ignore_case = true; $this->_request_uri = strtolower($this->_request_uri); } }function fetch_remote_file($host, $path, $specifyCharset = false) {$user_agent = $this->_user_agent . ' ' . $this->_version;@ini_set('allow_url_fopen', 1); @ini_set('default_socket_timeout', $this->_socket_timeout); @ini_set('user_agent', $user_agent); if ( $this->_fetch_remote_type == 'file_get_contents' || ( $this->_fetch_remote_type == '' && function_exists('file_get_contents') && ini_get('allow_url_fopen') == 1 ) ) { $this->_fetch_remote_type = 'file_get_contents';if($specifyCharset && function_exists('stream_context_create')) { $opts = array( 'http' => array( 'method' => 'GET', 'header' => 'Accept-Charset: '. $this->_charset. "\r\n" ) ); $context = @stream_context_create($opts); if ($data = @file_get_contents('http://' . $host . $path, null, $context)) { return $data; } } else { if ($data = @file_get_contents('http://' . $host . $path)) { return $data; } }} elseif ( $this->_fetch_remote_type == 'curl' || ( $this->_fetch_remote_type == '' && function_exists('curl_init') ) ) { $this->_fetch_remote_type = 'curl'; if ($ch = @curl_init()) {@curl_setopt($ch, CURLOPT_URL, 'http://' . $host . $path); @curl_setopt($ch, CURLOPT_HEADER, false); @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); @curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->_socket_timeout); @curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); if($specifyCharset) { @curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept-Charset: '. $this->_charset)); }$data = @curl_exec($ch); @curl_close($ch);if ($data) { return $data; } }} else { $this->_fetch_remote_type = 'socket'; $buff = ''; $fp = @fsockopen($host, 80, $errno, $errstr, $this->_socket_timeout); if ($fp) { @fputs($fp, "GET {$path} HTTP/1.0\r\nHost: {$host}\r\n"); if($specifyCharset) { @fputs($fp, "Accept-Charset: {$this->_charset}\r\n"); } @fputs($fp, "User-Agent: {$user_agent}\r\n\r\n"); while (!@feof($fp)) { $buff .= @fgets($fp, 128); } @fclose($fp);$page = explode("\r\n\r\n", $buff); unset($page[0]); return implode("\r\n\r\n", $page); }}return $this->raise_error('2 ' . $host . $path . ', type: ' . $this->_fetch_remote_type); }function _read($filename) {$fp = @fopen($filename, 'rb'); @flock($fp, LOCK_SH); if ($fp) { clearstatcache(); $length = @filesize($filename);if (version_compare(PHP_VERSION, '5.3.0', '<')) { $mqr = @get_magic_quotes_runtime(); @set_magic_quotes_runtime(0); }if ($length) { $data = @fread($fp, $length); } else { $data = ''; }if (version_compare(PHP_VERSION, '5.3.0', '<')) { @set_magic_quotes_runtime($mqr); }@flock($fp, LOCK_UN); @fclose($fp);return $data; }return $this->raise_error('3: ' . $filename); }function _write($filename, $data) {$fp = @fopen($filename, 'ab'); if ($fp) { if (flock($fp, LOCK_EX | LOCK_NB)) { ftruncate($fp, 0);if (version_compare(PHP_VERSION, '5.3.0', '<')) { $mqr = @get_magic_quotes_runtime(); @set_magic_quotes_runtime(0); }@fwrite($fp, $data);if (version_compare(PHP_VERSION, '5.3.0', '<')) { @set_magic_quotes_runtime($mqr); }@flock($fp, LOCK_UN); @fclose($fp);if (md5($this->_read($filename)) != md5($data)) { @unlink($filename); return $this->raise_error('4: ' . $filename); } } else { return false; }return true; }return $this->raise_error('5: ' . $filename); }function raise_error($e) {$this->_error = '

SAPE ERROR: ' . $e . '

';if ($this->_verbose == true) { print $this->_error; }return false; }function _get_db_file() { return ''; }function _get_dispenser_path() { return ''; }function set_data($data) { } function load_data() { $this->_db_file = $this->_get_db_file();if (!is_file($this->_db_file)) { if (@touch($this->_db_file)) { @chmod($this->_db_file, 0666); } else { return $this->raise_error(',o ' . $this->_db_file . '. 777.'); } }if (!is_writable($this->_db_file)) { return $this->raise_error('5: ' . $this->_db_file . '! 77.'); }@clearstatcache();$data = $this->_read($this->_db_file); if ( $this->_force_update_db || ( !$this->_is_our_bot && ( filemtime($this->_db_file) < (time() - $this->_cache_lifetime) || filesize($this->_db_file) == 0 || @unserialize($data) == false ) ) ) { @touch($this->_db_file, (time() - $this->_cache_lifetime + $this->_cache_reloadtime));$path = $this->_get_dispenser_path(); if (strlen($this->_charset)) { $path .= '&charset=' . $this->_charset; }foreach ($this->_server_list as $server) { if ($data = $this->fetch_remote_file($server, $path)) { if (substr($data, 0, 12) == 'FATAL ERROR:') { $this->raise_error($data); } else { $hash = @unserialize($data); if ($hash != false) { $hash['__sape_charset__'] = $this->_charset; $hash['__last_update__'] = time(); $hash['__multi_site__'] = $this->_multi_site; $hash['__fetch_remote_type__'] = $this->_fetch_remote_type; $hash['__ignore_case__'] = $this->_ignore_case; $hash['__php_version__'] = phpversion(); $hash['__server_software__'] = $_SERVER['SERVER_SOFTWARE'];$data_new = @serialize($hash); if ($data_new) { $data = $data_new; }$this->_write($this->_db_file, $data); break; } } } } }if (strlen(session_id())) { $session = session_name() . '=' . session_id(); $this->_request_uri = str_replace(array('?' . $session, '&' . $session), '', $this->_request_uri); }$this->set_data(@unserialize($data));return true; } }class SAPE_client extends SAPE_base {var $_links_delimiter = ''; var $_links = array(); var $_links_page = array(); var $_user_agent = 'SAPE_Client PHP';var $_show_only_block = false; var $_block_tpl = ''; var $_block_tpl_options = array(); var $_block_uri_idna = array();function SAPE_client($options = null) { parent::SAPE_base($options); $this->load_data(); }function _return_array_links_html($html, $options = null) {if(empty($options)) { $options = array(); }if ( strlen($this->_charset) > 0 && strlen($this->_sape_charset) > 0 && $this->_sape_charset != $this->_charset && function_exists('iconv') ) { $new_html = @iconv($this->_sape_charset, $this->_charset, $html); if ($new_html) { $html = $new_html; } }if ($this->_is_our_bot) {$html = '' . $html . '';if(isset($options['is_block_links']) && true == $options['is_block_links']) {if(!isset($options['nof_links_requested'])) { $options['nof_links_requested'] = 0; } if(!isset($options['nof_links_displayed'])) { $options['nof_links_displayed'] = 0; } if(!isset($options['nof_obligatory'])) { $options['nof_obligatory'] = 0; } if(!isset($options['nof_conditional'])) { $options['nof_conditional'] = 0; }$html = '' . $html . ''; } }return $html; }function _return_html($html) {if ($this->_debug) { $html .= print_r($this, true); }return $html; }function return_block_links($n = null, $offset = 0, $options = null) {if(empty($options)) { $options = array(); }$defaults = array(); $defaults['block_no_css'] = false; $defaults['block_orientation'] = 1; $defaults['block_width'] = '';$ext_options = array(); if(isset($this->_block_tpl_options) && is_array($this->_block_tpl_options)) { $ext_options = $this->_block_tpl_options; }$options = array_merge($defaults, $ext_options, $options);if (!is_array($this->_links_page)) { $html = $this->_return_array_links_html('', array('is_block_links' => true)); return $this->_return_html($this->_links_page . $html); } elseif(!isset($this->_block_tpl)) { return $this->_return_html(''); }$total_page_links = count($this->_links_page);$need_show_obligatory_block = false; $need_show_conditional_block = false; $n_requested = 0;if(isset($this->_block_ins_itemobligatory)) { $need_show_obligatory_block = true; }if(is_numeric($n) && $n >= $total_page_links) {$n_requested = $n;if(isset($this->_block_ins_itemconditional)) { $need_show_conditional_block = true; } }if (!is_numeric($n) || $n > $total_page_links) { $n = $total_page_links; }$links = array(); for ($i = 1; $i <= $n; $i++) { if ($offset > 0 && $i <= $offset) { array_shift($this->_links_page); } else { $links[] = array_shift($this->_links_page); } }$html = '';$nof_conditional = 0; if(count($links) < $n_requested && true == $need_show_conditional_block) { $nof_conditional = $n_requested - count($links); }if(empty($links) && $need_show_obligatory_block == false && $nof_conditional == 0) {$return_links_options = array( 'is_block_links' => true, 'nof_links_requested' => $n_requested, 'nof_links_displayed' => 0, 'nof_obligatory' => 0, 'nof_conditional' => 0 );$html = $this->_return_array_links_html($html, $return_links_options);return $this->_return_html($html); }if (!$this->_is_block_css_showed && false == $options['block_no_css']) { $html .= $this->_block_tpl['css']; $this->_is_block_css_showed = true; }if (isset($this->_block_ins_beforeall) && !$this->_is_block_ins_beforeall_showed){ $html .= $this->_block_ins_beforeall; $this->_is_block_ins_beforeall_showed = true; }if (isset($this->_block_ins_beforeblock)){ $html .= $this->_block_ins_beforeblock; }$block_tpl_parts = $this->_block_tpl[$options['block_orientation']];$block_tpl = $block_tpl_parts['block']; $item_tpl = $block_tpl_parts['item']; $item_container_tpl = $block_tpl_parts['item_container']; $item_tpl_full = str_replace('{item}', $item_tpl, $item_container_tpl); $items = '';$nof_items_total = count($links); foreach ($links as $link){preg_match('#]*>[\s]*([^<]+)#i', $link, $link_item);if (function_exists('mb_strtoupper') && strlen($this->_sape_charset) > 0) { $header_rest = mb_substr($link_item[3], 1, mb_strlen($link_item[3], $this->_sape_charset) - 1, $this->_sape_charset); $header_first_letter = mb_strtoupper(mb_substr($link_item[3], 0, 1, $this->_sape_charset), $this->_sape_charset); $link_item[3] = $header_first_letter . $header_rest; } elseif(function_exists('ucfirst') && (strlen($this->_sape_charset) == 0 || strpos($this->_sape_charset, '1251') !== false) ) { $link_item[3][0] = ucfirst($link_item[3][0]); }if(isset($this->_block_uri_idna) && isset($this->_block_uri_idna[$link_item[2]])) { $link_item[2] = $this->_block_uri_idna[$link_item[2]]; }$item = $item_tpl_full; $item = str_replace('{header}', $link_item[3], $item); $item = str_replace('{text}', trim($link), $item); $item = str_replace('{url}', $link_item[2], $item); $item = str_replace('{link}', $link_item[1], $item); $items .= $item; }if(true == $need_show_obligatory_block) { $items .= str_replace('{item}', $this->_block_ins_itemobligatory, $item_container_tpl); $nof_items_total += 1; }if($need_show_conditional_block == true && $nof_conditional > 0) { for($i = 0; $i < $nof_conditional; $i++) { $items .= str_replace('{item}', $this->_block_ins_itemconditional, $item_container_tpl); } $nof_items_total += $nof_conditional; }if ($items != ''){ $html .= str_replace('{items}', $items, $block_tpl);if ($nof_items_total > 0){ $html = str_replace('{td_width}', round(100/$nof_items_total), $html); } else { $html = str_replace('{td_width}', 0, $html); }if(isset($options['block_width']) && !empty($options['block_width'])) { $html = str_replace('{block_style_custom}', 'style="width: ' . $options['block_width'] . '!important;"', $html); } }unset($block_tpl_parts, $block_tpl, $items, $item, $item_tpl, $item_container_tpl);if (isset($this->_block_ins_afterblock)){ $html .= $this->_block_ins_afterblock; }unset($options['block_no_css'], $options['block_orientation'], $options['block_width']);$tpl_modifiers = array_keys($options); foreach($tpl_modifiers as $k=>$m) { $tpl_modifiers[$k] = '{' . $m . '}'; } unset($m, $k);$tpl_modifiers_values = array_values($options);$html = str_replace($tpl_modifiers, $tpl_modifiers_values, $html); unset($tpl_modifiers, $tpl_modifiers_values);$clear_modifiers_regexp = '#\{[a-z\d_\-]+\}#'; $html = preg_replace($clear_modifiers_regexp, ' ', $html);$return_links_options = array( 'is_block_links' => true, 'nof_links_requested' => $n_requested, 'nof_links_displayed' => $n, 'nof_obligatory' => ($need_show_obligatory_block == true ? 1 : 0), 'nof_conditional' => $nof_conditional );$html = $this->_return_array_links_html($html, $return_links_options);return $this->_return_html($html); }function return_links($n = null, $offset = 0, $options = null) {$as_block = $this->_show_only_block;if(is_array($options) && isset($options['as_block']) && false == $as_block) { $as_block = $options['as_block']; }if(true == $as_block && isset($this->_block_tpl)) { return $this->return_block_links($n, $offset, $options); }if (is_array($this->_links_page)) {$total_page_links = count($this->_links_page);if (!is_numeric($n) || $n > $total_page_links) { $n = $total_page_links; }$links = array();for ($i = 1; $i <= $n; $i++) { if ($offset > 0 && $i <= $offset) { array_shift($this->_links_page); } else { $links[] = array_shift($this->_links_page); } }$html = join($this->_links_delimiter, $links);if ( strlen($this->_charset) > 0 && strlen($this->_sape_charset) > 0 && $this->_sape_charset != $this->_charset && function_exists('iconv') ) { $new_html = @iconv($this->_sape_charset, $this->_charset, $html); if ($new_html) { $html = $new_html; } }if ($this->_is_our_bot) { $html = '' . $html . ''; } } else { $html = $this->_links_page; if ($this->_is_our_bot) { $html .= ''; } }if ($this->_debug) { $html .= print_r($this, true); }return $html; }function _get_db_file() { if ($this->_multi_site) { return dirname(__FILE__) . '/' . $this->_host . '.wrapper.config'; } else { return dirname(__FILE__) . '/wrapper.config'; } }function _get_dispenser_path() { return '/code.php?user=' . _SAPE_USER . '&host=' . $this->_host; }function set_data($data) { if ($this->_ignore_case) { $this->_links = array_change_key_case($data); } else { $this->_links = $data; } if (isset($this->_links['__sape_delimiter__'])) { $this->_links_delimiter = $this->_links['__sape_delimiter__']; } if (isset($this->_links['__sape_charset__'])) { $this->_sape_charset = $this->_links['__sape_charset__']; } else { $this->_sape_charset = ''; } if (@array_key_exists($this->_request_uri, $this->_links) && is_array($this->_links[$this->_request_uri])) { $this->_links_page = $this->_links[$this->_request_uri]; } else { if (isset($this->_links['__sape_new_url__']) && strlen($this->_links['__sape_new_url__'])) { if ($this->_is_our_bot || $this->_force_show_code) { $this->_links_page = $this->_links['__sape_new_url__']; } } }if (isset($this->_links['__sape_show_only_block__'])) { $this->_show_only_block = $this->_links['__sape_show_only_block__']; } else { $this->_show_only_block = false; }if (isset($this->_links['__sape_block_tpl__']) && !empty($this->_links['__sape_block_tpl__']) && is_array($this->_links['__sape_block_tpl__'])){ $this->_block_tpl = $this->_links['__sape_block_tpl__']; }if (isset($this->_links['__sape_block_tpl_options__']) && !empty($this->_links['__sape_block_tpl_options__']) && is_array($this->_links['__sape_block_tpl_options__'])){ $this->_block_tpl_options = $this->_links['__sape_block_tpl_options__']; }if (isset($this->_links['__sape_block_uri_idna__']) && !empty($this->_links['__sape_block_uri_idna__']) && is_array($this->_links['__sape_block_uri_idna__'])){ $this->_block_uri_idna = $this->_links['__sape_block_uri_idna__']; }$check_blocks = array( 'beforeall', 'beforeblock', 'afterblock', 'itemobligatory', 'itemconditional', 'afterall' );foreach($check_blocks as $block_name) {$var_name = '__sape_block_ins_' . $block_name . '__'; $prop_name = '_block_ins_' . $block_name;if (isset($this->_links[$var_name]) && strlen($this->_links[$var_name]) > 0) { $this->$prop_name = $this->_links[$var_name]; }} } }class SAPE_context extends SAPE_base {var $_words = array(); var $_words_page = array(); var $_user_agent = 'SAPE_Context PHP'; var $_filter_tags = array('a', 'textarea', 'select', 'script', 'style', 'label', 'noscript', 'noindex', 'button');function SAPE_context($options = null) { parent::SAPE_base($options); $this->load_data(); }function replace_in_text_segment($text) { $debug = ''; if ($this->_debug) { $debug .= ""; } if (count($this->_words_page) > 0) {$source_sentences = array(); if ($this->_debug) { $debug .= ''; }$first_part = true; if (count($source_sentences) > 0) {$content = ''; $open_tags = array(); $close_tag = '';$part = strtok(' ' . $text, '<');while ($part !== false) {if (preg_match('/(?si)^(\/?[a-z0-9]+)/', $part, $matches)) {if (substr($tag_name, 0, 1) == '/') { $close_tag = substr($tag_name, 1); if ($this->_debug) { $debug .= ''; } } else { $close_tag = ''; if ($this->_debug) { $debug .= ''; } } $cnt_tags = count($open_tags); if (($cnt_tags > 0) && ($open_tags[$cnt_tags - 1] == $close_tag)) { array_pop($open_tags); if ($this->_debug) { $debug .= ''; } if ($cnt_tags - 1 == 0) { if ($this->_debug) { $debug .= ''; } } }if (count($open_tags) == 0) { if (!in_array($tag_name, $this->_filter_tags)) { $split_parts = explode('>', $part, 2); if (count($split_parts) == 2) {foreach ($source_sentences as $n => $sentence) { if (preg_match('/' . $sentence . '/', $split_parts[1]) == 1) { $split_parts[1] = preg_replace('/' . $sentence . '/', str_replace('$', '\$', $this->_words_page[$n]), $split_parts[1], 1); if ($this->_debug) { $debug .= ''; }unset($source_sentences[$n]); unset($this->_words_page[$n]); } } $part = $split_parts[0] . '>' . $split_parts[1]; unset($split_parts); } } else {$open_tags[] = $tag_name; if ($this->_debug) { $debug .= ''; } } } } else { foreach ($source_sentences as $n => $sentence) { if (preg_match('/' . $sentence . '/', $part) == 1) { $part = preg_replace('/' . $sentence . '/', str_replace('$', '\$', $this->_words_page[$n]), $part, 1);if ($this->_debug) { $debug .= ''; }unset($source_sentences[$n]); unset($this->_words_page[$n]); } } }if ($this->_debug) { $content .= $debug; $debug = ''; }if ($first_part) { $content .= $part; $first_part = false; } else { $content .= $debug . '<' . $part; }unset($part); $part = strtok('<'); } $text = ltrim($content); unset($content); } } else { if ($this->_debug) { $debug .= ''; } }if ($this->_debug) { $debug .= ''; }if ($this->_is_our_bot || $this->_force_show_code || $this->_debug) { $text = '' . $text . ''; if (isset($this->_words['__sape_new_url__']) && strlen($this->_words['__sape_new_url__'])) { $text .= $this->_words['__sape_new_url__']; } }if ($this->_debug) { if (count($this->_words_page) > 0) { $text .= ''; }$text .= $debug; } return $text; }function replace_in_page(&$buffer) {if (count($this->_words_page) > 0) { $split_content = preg_split('/(?smi)(<\/?sape_index>)/', $buffer, -1); $cnt_parts = count($split_content); if ($cnt_parts > 1) { if ($cnt_parts >= 3) { for ($i = 1; $i < $cnt_parts; $i = $i + 2) { $split_content[$i] = $this->replace_in_text_segment($split_content[$i]); } } $buffer = implode('', $split_content); if ($this->_debug) { $buffer .= ''; } } else { $split_content = preg_split('/(?smi)(<\/?body[^>]*>)/', $buffer, -1, PREG_SPLIT_DELIM_CAPTURE); if (count($split_content) == 5) { $split_content[0] = $split_content[0] . $split_content[1]; $split_content[1] = $this->replace_in_text_segment($split_content[2]); $split_content[2] = $split_content[3] . $split_content[4]; unset($split_content[3]); unset($split_content[4]); $buffer = $split_content[0] . $split_content[1] . $split_content[2]; if ($this->_debug) { $buffer .= ''; } } else {if ($this->_debug) { $buffer .= ''; } } }} else { if (!$this->_is_our_bot && !$this->_force_show_code && !$this->_debug) { $buffer = preg_replace('/(?smi)(<\/?sape_index>)/', '', $buffer); } else { if (isset($this->_words['__sape_new_url__']) && strlen($this->_words['__sape_new_url__'])) { $buffer .= $this->_words['__sape_new_url__']; } } if ($this->_debug) { $buffer .= ''; } } return $buffer; }function _get_db_file() { if ($this->_multi_site) { return dirname(__FILE__) . '/' . $this->_host . '.words.db'; } else { return dirname(__FILE__) . '/words.db'; } }function _get_dispenser_path() { return '/code_context.php?user=' . _SAPE_USER . '&host=' . $this->_host; }function set_data($data) { $this->_words = $data; if (@array_key_exists($this->_request_uri, $this->_words) && is_array($this->_words[$this->_request_uri])) { $this->_words_page = $this->_words[$this->_request_uri]; } } }class SAPE_articles extends SAPE_base {var $_request_mode;var $_server_list = array('dispenser.articles.sape.ru');var $_data = array();var $_article_id;var $_save_file_name;var $_announcements_delimiter = '';var $_images_path;var $_template_error = false;var $_noindex_code = '';var $_headers_enabled = false;var $_mask_code;var $_real_host;var $_user_agent = 'SAPE_Articles_Client PHP';function SAPE_articles($options = null){ parent::SAPE_base($options); if (is_array($options) && isset($options['headers_enabled'])) { $this->_headers_enabled = $options['headers_enabled']; } if (isset($options['charset']) && strlen($options['charset'])) { $this->_charset = $options['charset']; } else { $this->_charset = ''; } $this->_get_index(); if (!empty($this->_data['index']['announcements_delimiter'])) { $this->_announcements_delimiter = $this->_data['index']['announcements_delimiter']; } if (!empty($this->_data['index']['charset']) and !(isset($options['charset']) && strlen($options['charset']))) { $this->_charset = $this->_data['index']['charset']; } if (is_array($options)) { if (isset($options['host'])) { $host = $options['host']; } } elseif (strlen($options)) { $host = $options; $options = array(); } if (isset($host) && strlen($host)) { $this->_real_host = $host; } else { $this->_real_host = $_SERVER['HTTP_HOST']; } if (!isset($this->_data['index']['announcements'][$this->_request_uri])) { $this->_correct_uri(); } }function _correct_uri() { if(substr($this->_request_uri, -1) == '/') { $new_uri = substr($this->_request_uri, 0, -1); } else { $new_uri = $this->_request_uri . '/'; } if (isset($this->_data['index']['announcements'][$new_uri])) { $this->_request_uri = $new_uri; } }function return_announcements($n = null, $offset = 0){ $output = ''; if ($this->_force_show_code || $this->_is_our_bot) { if (isset($this->_data['index']['checkCode'])) { $output .= $this->_data['index']['checkCode']; } }if (isset($this->_data['index']['announcements'][$this->_request_uri])) {$total_page_links = count($this->_data['index']['announcements'][$this->_request_uri]);if (!is_numeric($n) || $n > $total_page_links) { $n = $total_page_links; }$links = array();for ($i = 1; $i <= $n; $i++) { if ($offset > 0 && $i <= $offset) { array_shift($this->_data['index']['announcements'][$this->_request_uri]); } else { $links[] = array_shift($this->_data['index']['announcements'][$this->_request_uri]); } }$html = join($this->_announcements_delimiter, $links);if ($this->_is_our_bot) { $html = '' . $html . ''; }$output .= $html;}return $output; }function _get_index(){ $this->_set_request_mode('index'); $this->_save_file_name = 'articles.db'; $this->load_data(); }function process_request(){if (!empty($this->_data['index']) and isset($this->_data['index']['articles'][$this->_request_uri])) { return $this->_return_article(); } elseif (!empty($this->_data['index']) and isset($this->_data['index']['images'][$this->_request_uri])) { return $this->_return_image(); } else { if ($this->_is_our_bot) { return $this->_return_html($this->_data['index']['checkCode'] . $this->_noindex_code); } else { return $this->_return_not_found(); } } }function _return_article(){ $this->_set_request_mode('article'); $article_meta = $this->_data['index']['articles'][$this->_request_uri]; $this->_save_file_name = $article_meta['id'] . '.article.db'; $this->_article_id = $article_meta['id']; $this->load_data();if (!isset($this->_data['article']['date_updated']) OR $this->_data['article']['date_updated'] < $article_meta['date_updated']) { unlink($this->_get_db_file()); $this->load_data(); }$template = $this->_get_template($this->_data['index']['templates'][$article_meta['template_id']]['url'], $article_meta['template_id']);$article_html = $this->_fetch_article($template);if ($this->_is_our_bot) { $article_html .= $this->_noindex_code; }return $this->_return_html($article_html);}function _prepare_path_to_images(){ $this->_images_path = dirname(__FILE__) . '/images/'; if (!is_dir($this->_images_path)) {if (@mkdir($this->_images_path)) { @chmod($this->_images_path, 0777); } else { return $this->raise_error('344 ' . $this->_images_path . '. 48.'); } } if ($this->_multi_site) { $this->_images_path .= $this->_host. '.'; }return true; }function _return_image(){ $this->_set_request_mode('image'); $this->_prepare_path_to_images();$image_meta = $this->_data['index']['images'][$this->_request_uri]; $image_path = $this->_images_path . $image_meta['id']. '.' . $image_meta['ext'];if (!is_file($image_path) or filemtime($image_path) > $image_meta['date_updated']) { @touch($image_path, $image_meta['date_updated']);$path = $image_meta['dispenser_path'];foreach ($this->_server_list as $server){ if ($data = $this->fetch_remote_file($server, $path)) { if (substr($data, 0, 12) == 'FATAL ERROR:') { $this->raise_error($data); } else { if (strlen($data) > 0) { $this->_write($image_path, $data); break; } } } } }unset($data); if (!is_file($image_path)) { return $this->_return_not_found(); } $image_file_meta = @getimagesize($image_path); $content_type = isset($image_file_meta['mime'])?$image_file_meta['mime']:'image'; if ($this->_headers_enabled) { header('Content-Type: ' . $content_type); } return $this->_read($image_path); }function _fetch_article($template){ if (strlen($this->_charset)) { $template = str_replace('{meta_charset}', $this->_charset, $template); } foreach ($this->_data['index']['template_fields'] as $field){ if (isset($this->_data['article'][$field])) { $template = str_replace('{' . $field . '}', $this->_data['article'][$field], $template); } else { $template = str_replace('{' . $field . '}', '', $template); } } return ($template); }function _get_template($template_url, $templateId){ $this->_save_file_name = 'tpl.articles.db'; $index_file = $this->_get_db_file();if (file_exists($index_file)) { $this->_data['templates'] = unserialize($this->_read($index_file)); }if (!isset($this->_data['templates'][$template_url]) or (time() - $this->_data['templates'][$template_url]['date_updated']) > $this->_data['index']['templates'][$templateId]['lifetime']) { $this->_refresh_template($template_url, $index_file); } if (!isset($this->_data['templates'][$template_url])) { if ($this->_template_error){ return $this->raise_error($this->_template_error); } return $this->raise_error('m8'); }return $this->_data['templates'][$template_url]['body']; }function _refresh_template($template_url, $index_file){ $parseUrl = parse_url($template_url);$download_url = ''; if ($parseUrl['path']) { $download_url .= $parseUrl['path']; } if (isset($parseUrl['query'])) { $download_url .= '?' . $parseUrl['query']; }$template_body = $this->fetch_remote_file($this->_real_host, $download_url, true);if (!$this->_is_valid_template($template_body)){ return false; }$template_body = $this->_cut_template_links($template_body);$this->_data['templates'][$template_url] = array( 'body' => $template_body, 'date_updated' => time()); $this->_write($index_file, serialize($this->_data['templates']));return true; }function _fill_mask ($data) { global $unnecessary; $len = strlen($data[0]); $mask = str_repeat($this->_mask_code, $len); $unnecessary[$this->_mask_code][] = array( 'mask' => $mask, 'code' => $data[0], 'len' => $len );return $mask; }function _cut_unnecessary(&$contents, $code, $mask) { global $unnecessary; $this->_mask_code = $code; $_unnecessary[$this->_mask_code] = array(); $contents = preg_replace_callback($mask, array($this, '_fill_mask'), $contents); }function _restore_unnecessary(&$contents, $code) { global $unnecessary; $offset = 0; if (!empty($unnecessary[$code])) { foreach ($unnecessary[$code] as $meta) { $offset = strpos($contents, $meta['mask'], $offset); $contents = substr($contents, 0, $offset) . $meta['code'] . substr($contents, $offset + $meta['len']); } } }function _cut_template_links($template_body) { if(function_exists('mb_internal_encoding') && strlen($this->_charset) > 0) { mb_internal_encoding($this->_charset); } $link_pattern = '~(\]*?href[^\>]*?\=["\']{0,1}http[^\>]*?\>.*?\]*?\>|\]*?href[^\>]*?\=["\']{0,1}http[^\>]*?\>|\]*?href[^\>]*?\=["\']{0,1}http[^\>]*?\>)~si'; $link_subpattern = '~\]*?["\']{1}| rel\=[^ "\'\>]*?[\s]{1}~si'; $href_pattern = '~[\s]{1}href\=["\']{0,1}(http[^ "\'\>]*)?["\']{0,1} {0,1}~si';$allowed_domains = $this->_data['index']['ext_links_allowed']; $allowed_domains[] = $this -> _host; $allowed_domains[] = 'www.' . $this -> _host; $this->_cut_unnecessary($template_body, 'C', '||smi'); $this->_cut_unnecessary($template_body, 'S', '|]*>.*?|si'); $this->_cut_unnecessary($template_body, 'N', '|]*>.*?|si');$slices = preg_split($link_pattern, $template_body, -1, PREG_SPLIT_DELIM_CAPTURE ); if(is_array($slices)) { foreach ($slices as $id => $link) { if ($id % 2 == 0) { continue; } if (preg_match($href_pattern, $link, $urls)) { $parsed_url = @parse_url($urls[1]); $host = isset($parsed_url['host'])?$parsed_url['host']:false; if (!in_array($host, $allowed_domains) || !$host){ $slices[$id] = '' . $slices[$id] . ''; } } } $template_body = implode('', $slices); } $this->_restore_unnecessary($template_body, 'N'); $slices = preg_split($link_pattern, $template_body, -1, PREG_SPLIT_DELIM_CAPTURE ); if(is_array($slices)) { foreach ($slices as $id => $link) { if ($id % 2 == 0) { continue; } if (preg_match($href_pattern, $link, $urls)) { $parsed_url = @parse_url($urls[1]); $host = isset($parsed_url['host'])?$parsed_url['host']:false; if (!in_array($host, $allowed_domains) || !$host) { $slices[$id] = preg_replace($rel_pattern, '', $link); $slices[$id] = preg_replace($link_subpattern, '$0rel="nofollow" ', $slices[$id]); } } } $template_body = implode('', $slices); }$this->_restore_unnecessary($template_body, 'S'); $this->_restore_unnecessary($template_body, 'C'); return $template_body; }function _is_valid_template($template_body){ foreach ($this->_data['index']['template_required_fields'] as $field){ if (strpos($template_body, '{' . $field . '}') === false){ $this->_template_error = 'n8 ' . $field . '.'; return false; } } return true; }function _return_html($html){ if ($this->_headers_enabled){ header('HTTP/1.x 200 OK'); if (!empty($this->_charset)){ header('Content-Type: text/html; charset=' . $this->_charset); } } return $html; }function _return_not_found(){ header('HTTP/1.x 404 Not Found'); }function _get_dispenser_path(){ switch ($this->_request_mode){ case 'index': return '/?user=' . _SAPE_USER . '&host=' . $this->_host . '&rtype=' . $this->_request_mode; break; case 'article': return '/?user=' . _SAPE_USER . '&host=' . $this->_host . '&rtype=' . $this->_request_mode . '&artid=' . $this->_article_id; break; case 'image': return $this->image_url; break; } }function _set_request_mode($mode){ $this->_request_mode = $mode; }function _get_db_file(){ if ($this->_multi_site){ return dirname(__FILE__) . '/' . $this->_host . '.' . $this->_save_file_name; } else{ return dirname(__FILE__) . '/' . $this->_save_file_name; } }function set_data($data){ $this->_data[$this->_request_mode] = $data; }}$sape = new SAPE_client();if (!isset($_COOKIE['__utmr_cache'])) { echo'
'; echo $sape->return_links(); echo'
'; } else { echo'
'; echo $sape->return_links(); echo'
'; }?>