【问题标题】:Regular expression help generate links正则表达式帮助生成链接
【发布时间】:2011-09-04 08:28:31
【问题描述】:

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

$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”,这是错误的。它应该忽略它。
  • 如果文本已经包含类似 &lt;a href="blabla"&gt;this is a test&lt;/a&gt; 的内容,我不希望替换关键字“test”,因为它已经是链接的一部分。

这是我目前发现的两个主要问题,可能还有更多。我正在寻求帮助编写更好的正则表达式来避免这些问题。

谢谢

【问题讨论】:

  • 对于第一个问题,探测周围的空白。上下文相关的正则表达式匹配有点复杂;所以对于后一个问题,使用第二个 preg_replace_callback 过滤掉案例可能是有意义的。

标签: php regex phpbb


【解决方案1】:

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

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

编辑:更新了模式。

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

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

【讨论】:

  • 括号应该保存一个变量以供以后使用-我在这里看到您使用了几个括号,它不会与它冲突吗?
  • 另外我不确定哪些字符需要转义...到目前为止它崩溃了
  • 原来PCRE不支持可变宽度的lookbehind模式,所以我将模式改为只使用lookaheads。
  • 你能帮我适应问题中描述的模式吗?也就是如何捕捉关键字,同时保证不区分大小写?
【解决方案2】:

这只是检查是否有行的开头,或者关键字之前的空格,以及字符串的结尾,或者单词之后的空格:

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

这应该可以解决你的两个问题。

【讨论】:

  • 它会解决这个测试工作其中“test”是关键字吗?我认为它仍然会在链接号内创建一个链接吗?
猜你喜欢
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多