我正在使用正则表达式在文本中搜索一堆关键字。
找到所有关键字但只有一个:[DAM]柏林。我知道它包含一个方括号,所以我逃脱了它,但仍然没有运气。我做错了什么?
这是我的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);
感谢您的帮助!
答案 0 :(得分: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';
编辑:来自Daniel James的评论:
这可能更接近原始意图,因为它仍会检查'[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';
答案 1 :(得分:1)
你的正则表达式的第一部分是'/(?![^&lt;] +&gt;)\ b'所以它不会只匹配“[DAM] Berlin gallery”如果前面的字符是'&gt; ;?“
尝试:
$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修饰符]将字符串视为只有一个 最后一个换行符, 即使有多个新行 在我们的字符串中。“