preg_match,将url替换为bbcode

时间:2012-01-10 10:50:04

标签: php regex bbcode

我写了preg match rules:

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

当在文本中只有一个链接时,一切都很好,然后是一个 - 一个代码

这是我在多个链接时获得的: “text [a href =”http://google.com“&gt; LINK text text”

2 个答案:

答案 0 :(得分:2)

更改为'/\<a href\="(.*?)\">(.*?)\<\/a\>/i'以使匹配不 - 贪婪

答案 1 :(得分:0)

这是一个更好的正则表达式 - 它处理标签中的额外字段:

 \<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已经这样做了,但我很惊讶,因为有时你只想替换目标文本中的一个实例。