Мой 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://.+/)?([^"']+)['"]
которые должны работать