preg match, замените URL на bbcode

я пишу правила соответствия preg:

$subject = 'text  <a href="http://google.com">LINK</a> text text <a href="http://google2.com">LINK2</a>';

$search = array(
    '/\<a href\="(.*)\">(.*)\<\/a\>/i'
);

$replace = array(
    "[a href=\"$1\"]$2[/a]"
);

echo preg_replace($search, $replace, $subject);

Когда в тексте одна ссылка все работает отлично, потом больше одной - код краха

Это я получаю, когда есть более одной ссылки: "текст [a href="http://google.com">текст ССЫЛКИ текст"


person lolalola    schedule 10.01.2012    source источник


Ответы (2)


Измените на '/\<a href\="(.*?)\">(.*?)\<\/a\>/i', чтобы сделать сопоставление не-жадным.

person Halcyon    schedule 10.01.2012

Вот лучшее регулярное выражение - оно имеет дело с дополнительными полями в тегах:

 \<a (?:.*?)href\=[\"\']([^\"\']+?)[\"\'][^\>]*?\>(.+?)\<\/a\>

Я думаю, что я избежал всех специальных символов там, я не уверен, что PHP считает «особым», но в основном это должно соответствовать всему следующему:

 $subject = 'text  <a id="test" href="http://google.com">LINK</a> text text <a href="http://google2.com" id="test">LINK2</a> text <a href="http://google3.com">LINK3</a>';

Кроме того, я не знаю о PHP, но для сопоставления более чем одной ссылки в Perl вам нужен модификатор /g в конце этого регулярного выражения, поэтому:

 $search = array(
      '/\<a (?:.*?)href\=[\"\']([^\"\']+?)[\"\'][^\>]*?\>(.+?)\<\/a\>/ig'
 );

будет ваш поиск. Возможно, preg_replace уже делает это, но я был бы удивлен, поскольку бывают случаи, когда вы хотите заменить только один экземпляр в целевом тексте.

person Rohaq    schedule 10.01.2012