Intereting Posts
Выберите строки из таблицы MySQL, где временная метка PHP старше X Получить текстовый узел с помощью простого HTML DOM Parser Как получить категории для продукта в Magento Как узнать, когда необходим побег для MySQL рассчитать разницу между двумя числами Как отслеживать, откуда Magento вызывает шаблоны? Расширения PHP не будут загружаться при запуске Apache Использовать PHP cURL для открытия результата в новом окне Могу ли я использовать file_get_contents () для сравнения двух файлов? Автозаполнение jquery не работает с данными JSON Загрузка клиентской библиотеки google api в кодеритер Как отобразить первую букву как прописную букву? Отображение состояния сообщения: чтение и непрочитанное (отличается от других пользователей) в системе обмена сообщениями PHP / MySQL Рассчитать часы назад, используя время сервера в php без какой-либо другой даты Ошибка безопасности AWS SSL: 60: SSL-сертификат …: невозможно получить сертификат локального эмитента

preg_replace, чтобы изменить URL-адрес относительно абсолютного

Мой PHP-код:

$string = preg_replace('/(href|src)="([^:"]*)(?:")/i','$1="http://mydomain.com/$2"', $string); 

Он работает с:

  - <a href="aaa/">Link 1</a> => <a href="http://mydomain.com/aaa/">Link 1</a> - <a href="http://mydomain.com/bbb/">Link 1</a> => <a href="http://mydomain.com/bbb/">Link 1</a> 

Но не с:

 - <a href='aaa/'>Link 1</a> - <a href="#top">Link 1</a> (I don't want to change if url start by #). 

Пожалуйста, помогите мне!

Как насчет:

 $arr = array('<a href="aaa/">Link 1</a>', '<a href="http://mydomain.com/bbb/">Link 1</a>', "<a href='aaa/'>Link 1</a>", '<a href="#top">Link 1</a>'); foreach( $arr as $lnk) { $lnk = preg_replace('~(href|src)=(["\'])(?!#)(?!http://)([^\2]*)\2~i','$1="http://mydomain.com/$3"', $lnk); echo $lnk,"\n"; } 

вывод:

 <a href="http://mydomain.com/aaa/">Link 1</a> <a href="http://mydomain.com/bbb/">Link 1</a> <a href="http://mydomain.com/aaa/">Link 1</a> <a href="#top">Link 1</a> 

Объяснение:

 The regular expression: (?-imsx:(href|src)=(["\'])(?!#)(?!http://)([^\2]*)\2) matches as follows: NODE EXPLANATION ---------------------------------------------------------------------- (?-imsx: group, but do not capture (case-sensitive) (with ^ and $ matching normally) (with . not matching \n) (matching whitespace and # normally): ---------------------------------------------------------------------- ( group and capture to \1: ---------------------------------------------------------------------- href 'href' ---------------------------------------------------------------------- | OR ---------------------------------------------------------------------- src 'src' ---------------------------------------------------------------------- ) end of \1 ---------------------------------------------------------------------- = '=' ---------------------------------------------------------------------- ( group and capture to \2: ---------------------------------------------------------------------- ["\'] any character of: '"', '\'' ---------------------------------------------------------------------- ) end of \2 ---------------------------------------------------------------------- (?! look ahead to see if there is not: ---------------------------------------------------------------------- # '#' ---------------------------------------------------------------------- ) end of look-ahead ---------------------------------------------------------------------- (?! look ahead to see if there is not: ---------------------------------------------------------------------- http:// 'http://' ---------------------------------------------------------------------- ) end of look-ahead ---------------------------------------------------------------------- ( group and capture to \3: ---------------------------------------------------------------------- [^\2]* any character except: '\2' (0 or more times (matching the most amount possible)) ---------------------------------------------------------------------- ) end of \3 ---------------------------------------------------------------------- \2 what was matched by capture \2 ---------------------------------------------------------------------- ) end of grouping ---------------------------------------------------------------------- 

Это будет работать для вас

PHP:

 function expand_links($link) { return('href="http://example.com/'.trim($link, '\'"/\\').'"'); } $textarea = preg_replace('/href\s*=\s*(?<href>"[^\\"]*"|\'[^\\\']*\')/e', 'expand_links("$1")', $textarea); 

Я также изменил регулярное выражение для работы с двойными кавычками или апострофами

попробуйте это для своего шаблона

 /(href|src)=['"]([^"']+)['"]/i 

замена остается такой же, как и

РЕДАКТИРОВАТЬ:

подождите один … я не тестировал первые 2 типа ссылок, только те, которые не работали … дайте мне мгновение

REVISISED:

извините за первое регулярное выражение, я забыл о втором примере, который работал с доменом в нем

 (href|src)=['"](?:http://.+/)?([^"']+)['"] 

которые должны работать