У меня есть ссылки на некоторых страницах, которые используют старую систему, такую как:
<a href='/app/?query=stuff_is_here'>This is a link</a>
Они должны быть преобразованы в новую систему:
<a href='/newapp/?q=stuff+is+here'>This is a link</a>
Я могу использовать preg_replace t0 изменить некоторые из того, что мне нужно, но мне также нужно заменить подчеркивания в запросе на +. Мой текущий код:
//$content is the page html $content = preg_replace('#(href)="http://www.site.com/app/?query=([^:"]*)(?:")#','$1="http://www.site.com/newapp/?q=$2"',$content);
То, что я хочу сделать, это запустить str_replace в переменной $ 2, поэтому я попытался использовать preg_replace_callback и никогда не смог заставить его работать. Что мне делать?
Вы должны передать действительный обратный вызов [docs] в качестве второго параметра: имя функции, анонимную функцию и т. Д.
Вот пример:
function my_replace_callback($match) { $q = str_replace('_', '+', $match[2]); return $match[1] . '="http://www.site.com/newapp/?q=' . $q; } $content = preg_replace_callback('#(href)="http://www.site.com/app/?query=([^:"]*)(?:")#', 'my_replace_callback', $content);
Или с PHP 5.3:
$content = preg_replace_callback('#(href)="http://www.site.com/app/?query=([^:"]*)(?:")#', function($match) { $q = str_replace('_', '+', $match[2]); return $match[1] . '="http://www.site.com/newapp/?q=' . $q; }, $content);
Вы также можете попробовать с помощью парсера HTML вместо регулярного выражения: как вы анализируете и обрабатываете HTML / XML в PHP?
Анализ вашего документа с помощью dom, поиск всех тегов «а», а затем замена может быть хорошим способом. Кто-то уже прокомментировал отправку этой ссылки, чтобы показать вам, что регулярное выражение не всегда является лучшим способом работы с html.
Этот код должен работать:
<?php $dom = new DOMDocument; //html string contains your html $dom->loadHTML($html); ?><ul><? foreach( $dom->getElementsByTagName('a') as $node ) { //look for href attribute if( $node->hasAttribute( 'href' ) ) { $href = $node->getAttribute( 'href' ); // change hrefs value $node->setAttribute( "href", preg_replace( "/\/app\/\?query=(.*)/", "/newapp/?q=\1", $href ) ); } } //save new html $newHTML = $dom->saveHTML(); ?>
Обратите внимание, что я сделал это с preg_replace, но это можно сделать с помощью str_ireplace или str_replace
$newHref = str_ireplace("/app/?query=", "/newapp/?q=", $href);
Или вы можете просто использовать preg_match () и собирать соответствующие строки. Затем примените str_replace () к одному из совпадений и замените «+» на «_».
$content = preg_match('#href="\/[^\/]\/\?query=([^:"]+)#', $matches) $matches[2] = 'newapp'; $matches[4] = str_replace('_', '+', $matches[4]); $result = implode('', $matches)
Передать массивы в preg_replace
как шаблон и замену:
preg_replace(array('|/app/|', '_'), array('/newappp/', '+'), $content);