preg match, заменить URL на bbcode - PullRequest
1 голос
/ 10 января 2012

я пишу правила preg match:

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

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

Это я получаю, когда больше одной ссылки: "text [a href =" http://google.com">LINK текстовый текст "

Ответы [ 2 ]

2 голосов
/ 10 января 2012

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

0 голосов
/ 10 января 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 уже делает это, но я был бы удивлен, поскольку бывают случаи, когда вы хотите заменить только один экземпляр в целевом тексте.

...