1

我正在使用正则表达式在文本中搜索一堆关键字。

找到了所有关键字,但只有一个:[DAM]Berlin。我知道它包含一个方括号,所以我逃脱了它,但仍然没有运气。我究竟做错了什么?

这是我的php代码。

搜索关键字的文本:

$textToSearch= '<p><br>
Time ¦ emit LAb[au] <br>
<br>
[DAM]Berlin gallery<br>
<br>
Exhibition: February 21st - March 28th, 2009 <br>
<br>
Opening: Friday,  February 20th, 2009 7-9 pm <br>';

正则表达式:

$find='/(?![^<]+>)\b(generative art console|Game of Life|framework notations|framework|Floating numbers|factorial|f5x5x3|f5x5x1|eversion|A-plus|16n|\[DAM\]Berlin gallery)\b/s';

替换回调函数:

function replaceCallback( $match )
{
      if ( is_array( $match ) )
      {
        $htmlVersion = htmlspecialchars( $match[1], ENT_COMPAT, 'UTF-8' );
        $urlVersion  = urlencode( $match[1] );
        return '<a class="tag" rel="tag-definition" title="Click to know more about ' . $htmlVersion . '" href="?tag=' . $urlVersion. '">'. $htmlVersion  . '</a>';
      }
      return $match;
}

最后,电话:

$tagged_content = preg_replace_callback($find, 'replaceCallback',  $textToSearch);

感谢您的帮助 !

4

2 回答 2

3

我认为这是因为[不是“单词字符”,所以\b[无法[匹配[DAM]Berlin. 您可能需要将您的正则表达式更改为:

$find='/(?![^<]+>)(\b(?:generative art console|Game of Life|framework notations|framework|Floating numbers|factorial|f5x5x3|f5x5x1|eversion|A-plus|16n)|\[DAM\]Berlin gallery)\b/s';

编辑:来自丹尼尔詹姆斯的评论:

这可能更接近最初的意图,因为它仍然会检查 '[Dam]' 不跟随单词字符:

$find='/(?![^<]+>)(?<!\w)(generative art console|Game of Life|framework notations|framework|Floating numbers|factorial|f5x5x3|f5x5x1|eversion|A-plus|16n|\[DAM\]Berlin gallery)\b/s';
于 2009-06-20T13:22:21.303 回答
1

正则表达式的第一部分是 '/(?![^<]+>)\b' 所以如果它之前的字符是 '>',它不会只匹配“[DAM]柏林画廊”吗?

尝试:

$find='/(?![^<]+>)\b(generative art console|Game of Life|framework notations|framework|Floating numbers|factorial|f5x5x3|f5x5x1|eversion|A-plus|16n|\[DAM\]Berlin gallery)\b/sm'

这会将 m 修饰符添加到您的正则表达式中,以便它忽略新行

http://www.phpro.org/tutorials/Introduction-to-PHP-Regex.html#8

“[m 修饰符] 将字符串视为末尾只有一个换行符,即使我们的字符串中有多个换行符。”

于 2009-06-20T13:52:43.630 回答