我有一个字符串和一个名称列表,我使用preg_match_all
比较字符串,返回匹配项。但是,在名称列表中,某些名称只是名字或姓氏,而其他名称都是。请参阅下面的示例。
$names = 'jon|jon snow|lana|smith|lana smith|megan';
$string = 'Jon Snow and Lana Smith met up with Lana and Megan.';
preg_match_all("~\b($names)\b~i", $string, $matches);
上面的示例使用我当前的表达式返回所有名称。这不是我想要的。
我想要的回报: jon snow,lana smith,lana,megan。
我不想要的回复: jon,smith
答案 0 :(得分:1)
您似乎正在寻找negative lookaround assertions。
例如,assert()
匹配jon(?! snow)
,但仅在"jon"
未跟随时才会匹配。
" snow"
另一种可能性 - 不太明确但具有可比较的结果 - 是确保"复合"术语首先测试:
$names = 'jon(?! snow)|jon snow|lana(?! smith)|(?<!lana )smith|lana smith|megan';