正则表达式有助于生成链接

时间:2011-09-04 08:28:32

标签: php regex phpbb

我目前在循环中有以下代码:

$message = preg_replace("/({$data[0]})/i","<a href=\"{$data[1]}\" class=\"postlink\">$1</a>",$message,1);

这个循环的目的是寻找特定的关键字($ data [0])并将它们转换为$ data [1]中URL的链接。我也使用限制为1。

这在某种程度上可行。但是,我正在尝试改进此正则表达式以防止出现以下问题:

  • 如果URL实际上包含一个标记的关键字,那么事情就会搞砸。例如,如果“test”是一个关键字,并且该页面有一个指向“http://www.site.com/test.html”之类的URL的链接,那么它将替换错误的“test.html”。它应该忽略它。
  • 如果文字已包含<a href="blabla">this is a test</a>之类的内容,我不希望替换关键字“test”,因为它已经是链接的一部分。

这是我到目前为止所遇到的主要问题,可能还有更多。我正在寻找帮助,写一个更好的正则表达式来避免这些问题。

由于

2 个答案:

答案 0 :(得分:0)

这些很有趣。要使用,只需将“test”替换为下面模式中的数据。

/test(?![^><]*?(?:>|<\/a))/

编辑:更新了模式。

在回复您的评论时,请使用以下内容:

$message = preg_replace("/({$data[0]}(?![^><]*?(?:>|<\/a)))/i","<a href=\"{$data[1]}\" class=\"postlink\">$1</a>",$message,1);

答案 1 :(得分:0)

这只是检查行的开头,或关键字前的空格,字符串的结尾,或单词后面的空格:

 $message = preg_replace("/(^|\s)({$data[0]})($|\s)/mi","$1<a href=\"{$data[1]}\" class=\"postlink\">$2</a>$3",$message,1);

这应解决你的问题。