PHP « Замена ссылок на странице по регулярному выражению

Как всегда не любят меня регулярные выражения :(

Задача в следующем: есть некая HTML страница, нужно регуляркой заменить все ссылки на якоря. При этом все атрибуты тега /** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .html4strict.geshi_code {font-family:monospace;} .html4strict.geshi_code .imp {font-weight: bold; color: red;} .html4strict.geshi_code .kw2 {color: #000000; font-weight: bold;} .html4strict.geshi_code .kw3 {color: #000066;} .html4strict.geshi_code .es0 {color: #000099; font-weight: bold;} .html4strict.geshi_code .br0 {color: #66cc66;} .html4strict.geshi_code .sy0 {color: #66cc66;} .html4strict.geshi_code .st0 {color: #ff0000;} .html4strict.geshi_code .nu0 {color: #cc66cc;} .html4strict.geshi_code .sc-1 {color: #808080; font-style: italic;} .html4strict.geshi_code .sc0 {color: #00bbdd;} .html4strict.geshi_code .sc1 {color: #ddbb00;} .html4strict.geshi_code .sc2 {color: #009900;} .html4strict.geshi_code span.xtra { display:block; }

<a>
 
должны сохранятся.

Пробую вот так:

/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }

preg_replace("`<a (.*?)href *= *("|')+.+("|')+ (.*?)>(.+?)</a>`i","<a $1href='#' $4>$5</a>",$content);
 


Но проблема заключается в том, что если на одной строке две ссылки, то парсер "проглатывает" первую, подменяя все второй. Т.е. строка вида:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .html4strict.geshi_code {font-family:monospace;} .html4strict.geshi_code .imp {font-weight: bold; color: red;} .html4strict.geshi_code .kw2 {color: #000000; font-weight: bold;} .html4strict.geshi_code .kw3 {color: #000066;} .html4strict.geshi_code .es0 {color: #000099; font-weight: bold;} .html4strict.geshi_code .br0 {color: #66cc66;} .html4strict.geshi_code .sy0 {color: #66cc66;} .html4strict.geshi_code .st0 {color: #ff0000;} .html4strict.geshi_code .nu0 {color: #cc66cc;} .html4strict.geshi_code .sc-1 {color: #808080; font-style: italic;} .html4strict.geshi_code .sc0 {color: #00bbdd;} .html4strict.geshi_code .sc1 {color: #ddbb00;} .html4strict.geshi_code .sc2 {color: #009900;} .html4strict.geshi_code span.xtra { display:block; }

<li ><a href="/goods/index.html">Продукция</a></li><li ><a href="/basket/index.html">Моя корзина</a></li>
 


преобразуется в строку вида:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .html4strict.geshi_code {font-family:monospace;} .html4strict.geshi_code .imp {font-weight: bold; color: red;} .html4strict.geshi_code .kw2 {color: #000000; font-weight: bold;} .html4strict.geshi_code .kw3 {color: #000066;} .html4strict.geshi_code .es0 {color: #000099; font-weight: bold;} .html4strict.geshi_code .br0 {color: #66cc66;} .html4strict.geshi_code .sy0 {color: #66cc66;} .html4strict.geshi_code .st0 {color: #ff0000;} .html4strict.geshi_code .nu0 {color: #cc66cc;} .html4strict.geshi_code .sc-1 {color: #808080; font-style: italic;} .html4strict.geshi_code .sc0 {color: #00bbdd;} .html4strict.geshi_code .sc1 {color: #ddbb00;} .html4strict.geshi_code .sc2 {color: #009900;} .html4strict.geshi_code span.xtra { display:block; }

<li ><a href='#'>Моя корзина</a></li>
 


При этом атрибуты ссылок отбрасываются, а часть ссылок вообще режется. Главное, не могу понять в чем моя ошибка. Буду очень признателен за помощь.

То что есть:
medium.gif

То что остается после регулярки:
medium.gif

1 ответов



$str = '<li><a href="/goods/index.html">Продукция</a></li><li><a href="/basket/index.html">Моя корзина</a></li>';
$str1 = preg_replace('/<a(.+?)href="(.+?)"(.*?)>(.+?)<\/a>/i', '<a$1href="#"$3>$4</a>', $str);
//'<li><a href="#">Продукция</a></li><li><a href="#">Моя корзина</a></li>'
 

Так нужно?

Вопрос наверно старый, но я отвечу. Тут ошибка большая, которую нельзя допускать ни в коем случае.
Строка -
сти, все равно использовать точку не рекомендую. В данном примере можно было бы написать так -
Еще одно решение может быть. если просто заменить знак плюса на умножить. Смысл писать плюс потом вопрос вообще не вижу).


Здравствуйте, помогите к выражнию
$description = preg_replace("|HREF=\"([0-9]*)\"|si", "HREF=\"$url"."dic_tid=\\1\"" , $description);
подставить rel="nofollow"


Здравствуйте, помогите к выражнию
$description = preg_replace("|HREF=\"([0-9]*)\"|si", "HREF=\"$url"."dic_tid=\\1\"" , $description);
подставить rel="nofollow"


Если можно сделать замену на клиентской стороне, то сделайте это очень смешной строкой кода jQuery

$("a").attr("href", "#");

С новой версией jQuery это кажись будет так
$("a").prop({href:"#"});


$str = '<ul><li><a class="active" href="/goods/index.html">Продукция</a></li><li><a href="/basket/index.html" id="test">Корзина</a></li></ul>';
$str = preg_replace('#href="/(\w+)/.+"#U', 'href="#$1"', $str);
/* А лучше жестко: */
// $str = preg_replace('#href="/(\w+)/index.html"#', 'href="#$1"', $str);
echo $str;
 

«U» нужно для того, чтобы «.+» был не жадным.

В обоих результатах на выходе будет

<ul><li><a class="active" href="#goods">Продукция</a></li><li><a href="#basket" id="test">Корзина</a></li></ul>
 

В общем спасибо большое пользователю ustisha за совет.

На базе его решения сделал так:


preg_replace('/<a(.+?)href=("|\')(.+?)("|\')(.*?)>(.+?)<\/a>/i', '<a$1href="#"$5>$6</a>', $content);
 

и вроде заработало.