一尘不染

正则表达式单词边界在PHP中如何工作?

php

我目前正在编写一个用于匹配内容中特定单词的库。

本质上,它的工作方式是将单词编译为正则表达式,然后通过所述正则表达式运行内容。

我要添加的功能是指定要匹配的给定单词是否必须以单词开头和/或结尾。例如,我有这个词cat。我指定它 必须开始一个字 ,因此catering
匹配cat是在开始,但ducat 不能匹配cat不启动的话。

我想使用单词边界来执行此操作,但是在进行一些测试时,我发现它无法正常运行。

采取以下措施,

preg_match("/(^|\b)@nimal/i", "something@nimal", $match);
preg_match("/(^|\b)@nimal/i", "something!@nimal", $match);

在上面的陈述中,我希望得到以下结果,

> false
> 1 (@nimal)

但是结果相反,

> 1 (@nimal)
> false

首先,我希望它会失败,因为小组会吃掉@,而nimal与匹配@nimal,显然不会。而是,该组匹配一个空字符串,因此@nimal被匹配,意味着@该单词被认为是单词的一部分。

在第二个中,我希望小组吃!剩下的@nimal来匹配其余的(应该)。相反,它似乎是将!@组合在一起形成一个单词,该单词通过以下匹配得到确认,

preg_match("/g\b!@\bn/i", "something!@nimal", $match);

任何想法为什么这样做的正则表达式?

我只是 喜欢 一个页面,清楚地记录了如何确定单词边界,但我终生找不到一个页面。


阅读 392

收藏
2020-05-29

共1个答案

一尘不染

单词边界\b\w(单词字符)变为\W非单词字符时匹配。您想匹配的字符\b前面是否有@一个\W。因此,要匹配,您需要在输入文字之前@

something@nimal
        ^^

==>由于和之间的单词边界g而匹配@

something!@nimal
         ^^

==> NO匹配,因为之间!@没有字边界,这两个字符都是\W

2020-05-29