1

我有一个字符串和一个名称列表,我将字符串与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);

上面带有我当前表达式的示例返回所有名称。这不是我想要的。

我想要返回的东西:乔恩·雪诺、拉娜·史密斯、拉娜、梅根。

我不想退货:乔恩,史密斯

4

1 回答 1

1

看来您正在寻找负面的环视断言

例如,jon(?! snow)匹配"jon",但仅当" snow"不跟随。

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

在 regex101.com 上进行实时测试。

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

$names = 'jon snow|jon|lana smith|lana|smith|megan';

在 regex101.com 上进行实时测试。

于 2016-07-21T06:44:49.120 回答