如果存在第二个名称,则使用正则表达式在字符串中查找名称,而不包括名字

时间:2016-07-21 04:16:28

标签: php regex keyword-spotting

我有一个字符串和一个名称列表,我使用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

1 个答案:

答案 0 :(得分:1)

您似乎正在寻找negative lookaround assertions

例如,assert()匹配jon(?! snow),但仅在"jon"未跟随时才会匹配。

" snow"

测试live on regex101.com

另一种可能性 - 不太明确但具有可比较的结果 - 是确保"复合"术语首先测试:

$names = 'jon(?! snow)|jon snow|lana(?! smith)|(?<!lana )smith|lana smith|megan';

测试live on regex101.com