Intereting Posts
Анализ XML с несколькими пространствами имен Преобразовать координаты латинского / длинного в пиксель X и Y PHP CURL & HTTPS Расширенные заполнители для SQL, например WHERE id IN (??) подключение веб-сервисов PHP с Android Рекурсивное PHP-регулярное выражение Найти массив ключей в php и изменить его значение или содержимое? Ошибка php: класс «Imagick» не найден Предупреждение: mysql_fetch_array (): предоставленный аргумент не является допустимым ресурсом результата MySQL Как я могу присоединиться к трем таблицам с помощью MYSQLi? Отправить зашифрованный файл (zip или txt) – через PHP – можно открыть на ПК с Windows PHP: как получить $ для печати с использованием эха API групп LinkedIn – получение логотипа группы для нескольких групп в одном запросе API Отображение сообщений Facebook для пользователей, не являющихся пользователями Facebook Как получить 100% покрытие кода с помощью PHPUnit

Preg_replace или preg_replace_callback?

У меня есть ссылки на некоторых страницах, которые используют старую систему, такую ​​как:

<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);