Кто шарит в регулярных, помогите

pachanga

Новичок
Кто шарит в регулярных, помогите

Проблема в следущем:

У меня есть некий html код, мне надо отловить там все атрибуты href в тегах <a> и поменять ссылку на файл с расширения .html на .htm (так надо, не удивляйтесь),
т.е. <a href=wow.html> меняется на <a href=wow.htm>.

Нижеследущий код(кстати, можете его исполнить у себя) это в принципе делает, но с оговоркой(ниже):
PHP:
//html
$htm = <<<EOD
<p><br><a href='/chapter2/2.2.html' class='level'>'Я ламер?'</a><b>wow</b>
<div class="levelnav"><a href=/chapter2/2.3.html class="level">"Я ламер?"</a></div>
<span><a href='/chapter2/2.4.html' class="level">Я ламер?</a></span>
EOD;

$search = array("/(<a\s+href=(?:\"|\'|))([^\"\'>\s]+)((?:\"|\'|).*?>.*?<\/a>)/ie");//черт ногу сломит, но работает :)                 
$replace = array("\"$1\".change_extension(\"$2\").\"$3\""); //change_extension объявлена ниже
		
$htm = preg_replace($search, $replace, $htm);

echo $htm;

/////////////////////////////////////////////
function change_extension($url)
{
	$path_parts = pathinfo($url);	
	
	if(isset($path_parts['extension']))
	{
		$extension = '.'.$path_parts['extension'];
		
		if( $extension == '.html')
		{
			$replace = array("$extension" => '.htm');
			$url = strtr($url, $replace);
		
			return $url; 
		}
	}
	
	return $url;
}
/////////////////////////////////////////////
Результатом работы скрипта будет:

<p><br><a href=\'/chapter2/2.2.html\' class=\'level\'>\'Я ламер?\'</a><b>wow</b>
<div class="levelnav"><a href=/chapter2/2.3.html class="level">"Я ламер?"</a></div>
<span><a href=\'/chapter2/2.4.html\' class="level">Я ламер?</a></span>

Если заметили, ко всем одинарным кавычкам внутри <a../a> добавились слэши ! Почему????!!! Я битых 3 часа башку ломаю!
 

pachanga

Новичок
Ой, результатом работы скрипта будет:

<p><br><a href=\'/chapter2/2.2.htm\' class=\'level\'>\'Я ламер?\'</a><b>wow</b>
<div class="levelnav"><a href=/chapter2/2.3.htm class="level">"Я ламер?"</a></div>
<span><a href=\'/chapter2/2.4.htm\' class="level">Я ламер?</a></span>

Т.е. расширения меняются, но появляются артефакты в виде слэшей :(
Надеюсь, форум слэши не режет?
 

pachanga

Новичок
Все спасибо, сам разобрался :)

Вот, может кому сгодится, утащено с www.php.net:

Note the there is an implicit addslashes done to all matches when using the
e-modifier for security reasons. If you're working with strings that may
have single or double quotes, be sure to use an explicit stripslashes on
your matches.

Example:
PHP:
$string = preg_replace('/<([^>]+)>/e',
'processing_function(stripslashes("\1"))', $string);
В моем случае строку:
$replace = array("\"$1\".change_extension(\"$2\").\"$3\"");
надо заменить на
$replace = array('stripslashes("\\1").change_extension(stripslashes("\\2")).stripslashes("\\3")');
 
Сверху