我目前正在编写一个库,用于匹配内容中的特定单词.
基本上它的工作方式是将单词编译成正则表达式,并通过所述正则表达式运行内容.
我想要添加的功能是指定要匹配的给定单词是否必须开始和/或结束单词.例如,我有这个词cat
.我指定它必须开始一个字,因此catering
将匹配的cat
是在开始,但ducat
不能匹配为cat
不启动的话.
我想用字边界做这个,但在一些测试中我发现它不能像我期望的那样工作.
采取以下,
preg_match("/(^|\b)@nimal/i", "something@nimal", $match);
preg_match("/(^|\b)@nimal/i", "something!@nimal", $match);
Run Code Online (Sandbox Code Playgroud)
在上面的陈述中,我希望得到以下结果,
> false
> 1 (@nimal)
Run Code Online (Sandbox Code Playgroud)
但结果恰恰相反,
> 1 (@nimal)
> false
Run Code Online (Sandbox Code Playgroud)
在第一个,我会期望它失败,因为该组将吃掉@
,留下nimal
来匹配@nimal
,这显然不会.相反,该组匹配一个空字符串,因此@nimal
匹配,意味着@
被认为是该单词的一部分.
在第二,我希望小组吃!
剩下@nimal
来匹配其余的(应该).相反,它似乎将这些!
和@
组合在一起形成一个单词,这可以通过以下匹配来确认,
preg_match("/g\b!@\bn/i", "something!@nimal", $match);
Run Code Online (Sandbox Code Playgroud)
任何想法为什么正则表达式这样做?
我只是喜欢一个清楚记录字边界是如何确定的页面,我找不到一个用于生活的人.
ste*_*ema 19
单词边界\b
匹配从\w
(单词字符)到\W
非单词字符的变化.如果\b
你@
的\W
角色之前有一个,你想要匹配.所以为了匹配,你需要一个单词字符@
something@nimal
^^
Run Code Online (Sandbox Code Playgroud)
==>因为之间的字边界的匹配g
和@
.
something!@nimal
^^
Run Code Online (Sandbox Code Playgroud)
==> NO匹配,因为之间!
并@
没有字边界,这两个字符都是\W