如果存在第二个名字,则使用正则表达式在不包括名字的字符串中查找名字
Find names in string using regex without including first names if second name is present
我有一个字符串和一个名称列表,我将字符串与使用 preg_match_all
进行比较,其中 returns 匹配。但是,在名称列表中,有些名称只是名字或姓氏,而另一些则是两者兼而有之。请参阅下面的示例。
$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);
上面的例子用我当前的表达式returns所有的名字。这不是我想要的。
我想要的返回:jon snow, lana smith, lana, megan.
我不想退回的东西:乔恩,史密斯
您似乎在寻找 negative lookaround assertions。
例如,jon(?! snow)
匹配 "jon"
,但前提是 " snow"
不匹配。
$names = 'jon(?! snow)|jon snow|lana(?! smith)|(?<!lana )smith|lana smith|megan';
测试一下live on regex101.com。
另一种可能性 - 不太明确但具有可比结果 - 是确保首先测试 "composite" 项:
$names = 'jon snow|jon|lana smith|lana|smith|megan';
测试一下 live on regex101.com。
我有一个字符串和一个名称列表,我将字符串与使用 preg_match_all
进行比较,其中 returns 匹配。但是,在名称列表中,有些名称只是名字或姓氏,而另一些则是两者兼而有之。请参阅下面的示例。
$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);
上面的例子用我当前的表达式returns所有的名字。这不是我想要的。
我想要的返回:jon snow, lana smith, lana, megan.
我不想退回的东西:乔恩,史密斯
您似乎在寻找 negative lookaround assertions。
例如,jon(?! snow)
匹配 "jon"
,但前提是 " snow"
不匹配。
$names = 'jon(?! snow)|jon snow|lana(?! smith)|(?<!lana )smith|lana smith|megan';
测试一下live on regex101.com。
另一种可能性 - 不太明确但具有可比结果 - 是确保首先测试 "composite" 项:
$names = 'jon snow|jon|lana smith|lana|smith|megan';
测试一下 live on regex101.com。