Php 如何查找包含方括号的字符串?

Php 如何查找包含方括号的字符串?,php,regex,square-bracket,Php,Regex,Square Bracket,我用正则表达式搜索文本中的一组关键字 所有关键词都找到了,只有一个:[大坝]柏林。我知道它包含一个方括号,所以我逃脱了,但仍然没有运气。我做错了什么 这是我的php代码 要搜索关键字的文本: $textToSearch= '<p><br> Time ¦ emit LAb[au] <br> <br> [DAM]Berlin gallery<br> <br> Exhibition: February 21st - March 2

我用正则表达式搜索文本中的一组关键字

所有关键词都找到了,只有一个:[大坝]柏林。我知道它包含一个方括号,所以我逃脱了,但仍然没有运气。我做错了什么

这是我的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>';

谢谢你的帮助

我认为这是因为
[
不是一个“单词字符”,所以
\b[
无法匹配
[
[DAM]Berlin
的开头。您可能需要将regex更改为:

$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';
$find='/(?![^)(\b(?:生成艺术控制台|生活游戏|框架符号|框架|浮点数|阶乘| f5x5x3 | f5x5x1 |外翻| A-plus | 16n)| |[大坝\]柏林画廊)\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';

$find='/(?![^)(?我想这是因为
[
不是一个“单词字符”,所以
\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';
$find='/(?![^)(\b(?:生成艺术控制台|生活游戏|框架符号|框架|浮点数|阶乘| f5x5x3 | f5x5x1 |外翻| A-plus | 16n)| |[大坝\]柏林画廊)\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';

$find='/(?![^)(?您的正则表达式的第一部分是'/(?![^)\b',所以如果前面的字符是'>',它不会只匹配“[DAM]Berlin gallery”吗

尝试:

$find='/(?![^)b(生成式艺术控制台|生活游戏|框架符号|框架|浮点数|阶乘| f5x5x3 | f5x5x1 |外翻| A-plus | 16n |柏林画廊)\b/sm
这会将m修饰符添加到正则表达式中,以便忽略新行

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


正则表达式的第一部分是“/(?![^)\b”,因此如果前面的字符是“>”,它不会只匹配“[DAM]Berlin gallery”吗

尝试:

$find='/(?![^)b(生成式艺术控制台|生活游戏|框架符号|框架|浮点数|阶乘| f5x5x3 | f5x5x1 |外翻| A-plus | 16n |柏林画廊)\b/sm
这会将m修饰符添加到正则表达式中,以便忽略新行

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


我尝试了你的建议,但是php返回了一个警告。有没有替代b标志的方法?下面是警告:preg_replace_callback():编译失败:偏移量166处的括号不匹配删除结尾处的右括号\b)/s(这一个)这可能更接近原始意图,因为它仍然会检查“[Dam]'不跟在单词字符后面:$find='/(?![^)(?令人惊讶的是,在最后的代码中,丹尼尔的建议是有效的。海伦的建议破坏了结果文本。事实上,我正在搜索很多关键字可能是原因。无论如何,感谢你们两个!@pixeline:这一定是我添加的新捕获组…将其变成了非捕获组。但是丹尼尔的变体sh无论如何,我会更可靠。我尝试了你的建议,但是php返回了一个警告。有没有替代b标志的方法?下面是警告:preg_replace_callback():编译失败:偏移量166处的不匹配圆括号删除\b)/s结尾处的右圆括号(这一个)这可能更接近原意,因为它仍然会检查“[Dam]”是否跟在单词字符后面:$find='/(?![^)(?令人惊讶的是,在最后的代码中,丹尼尔的建议是有效的。海伦的建议破坏了结果文本。事实上,我正在搜索很多关键字可能是原因。无论如何,感谢你们两个!@pixeline:这一定是我添加的新捕获组…将其变成了非捕获组。但是丹尼尔的变体sh无论如何,我们会更可靠。
$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';
$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'