PHP 正则表达式中的单词边界语义
在 PHP 中,单词边界是使用 b 元字符实现的,它匹配单词字符之间的转换 ( w) 和非单词字符 (W)。但是,其行为可能存在细微差别,如您提供的测试用例所示。
意外的单词边界
在您的测试用例中,您期望以下结果:
preg_match("/(^|\b)@nimal/i", "something@nimal", $match); // false preg_match("/(^|\b)@nimal/i", "something!@nimal", $match); // true
但实际结果却相反:
preg_match("/(^|\b)@nimal/i", "something@nimal", $match); // true preg_match("/(^|\b)@nimal/i", "something!@nimal", $match); // false
出现此异常是因为 b 元字符在单词字符 (w) 到非单词字符 (W) 的转换处匹配。在第一种情况“something@nimal”中,单词边界出现在“g”(单词字符)和“@”(非单词字符)之间,从而导致匹配。然而,在第二种情况“something!@nimal”中,“!”之间没有单词边界。和“@”,因为两者都是非单词字符。
匹配单词开头
要匹配以特定序列开头的单词,您需要确保有目标序列之前的单词边界 (b)。例如,要匹配以“@nimal”开头的单词,您可以使用以下正则表达式:
preg_match("/(\b)@nimal/i", "something@nimal", $match); // true preg_match("/(\b)@nimal/i", "something!@nimal", $match); // false
在此正则表达式中,单词边界 (b) 将确保存在从单词字符的转换“@nimal”之前的非单词字符。这将匹配以“@nimal”开头的单词,但不匹配中间有“@nimal”的单词,例如“ducat”。
以上是PHP 正则表达式中何时出现单词边界?的详细内容。更多信息请关注PHP中文网其他相关文章!