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 に答える