【发布时间】:2011-06-30 08:01:51
【问题描述】:
我目前正在编写一个库,用于匹配内容中的特定单词。
基本上它的工作方式是将单词编译成正则表达式,并通过所述正则表达式运行内容。
我要添加的功能是指定要匹配的给定单词是否必须开始和/或结束一个单词。例如,我有单词cat。我指定它必须开始一个单词,所以catering 将匹配,因为cat 在开头,但ducat 不会匹配 因为cat 没有开始这个词。
我想使用word boundaries 执行此操作,但在一些测试中我发现它并没有像我预期的那样工作。
采取以下,
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);
知道为什么正则表达式会这样做吗?
我只是喜欢一个清楚地记录单词边界是如何确定的页面,我只是找不到一个适合我的生活。
【问题讨论】: