4

メールアドレスの照合を試みますが、先頭に「mailto:」が付いていない場合のみです。私はこの正規表現を試します:

"/(?<!mailto:)[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/"

この文字列に対して: '<a href="mailto:someemail@domain.com">EMAIL</a> ... otheremail@domain.com '

私はキャッチだけを期待して'otheremail@domain.com'いますが、私はまた、'omeemail@domain.com'行方不明を参照してください's'。ここで何が問題なのだろうか。後読みアサーションの後に通常の正規表現を使用できませんか?

PHP での私の例全体は次のようになります。

$testString = '<a href="mailto:someemail@domain.com">EMAIL</a>  ...   otheremail@domain.com ';
$pattern = "/(?<!mailto:)[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/";
preg_match_all($pattern, $testString, $matches);
echo('<pre>');print_r($matches);echo('</pre>');

ありがとうございました!

4

3 に答える 3

5

s正規表現に一致する文字列があった後、、、omeemail@domain.comおよびsほとんどmailto:一致しないためです。そこに単語の境界を取得すると、ほとんどの場合に機能します。

変化する:

(?<!mailto:)

に:

(?<!mailto:)\b

ちなみに、example.comを例に使用すると、domain.comは実際の会社が所有しています。

于 2011-07-21T23:22:50.017 に答える
2

「someemail@」で一致しようとしますが、直前に「mailto:」があるため失敗します。したがって、「omeemail @」で一致しようとします。これは、直前に「mailto:」がないため成功します。

編集:に変更(?<!mailto:)する(?!mailto:)のが最も効果的だと思います。

@Wrikken:正規表現では「。」が許可されます。メールアドレスに記載されていますが、お持ちの場合(?<!mailto:)\bは「mailto:some.email@」が「email@」から照合されます。

于 2011-07-21T23:27:50.307 に答える
0

したがって、@Wrikken と @MRAB からのヒントを使用して、最終的な有効な正規表現を作成します。
"/(?<!mailto:)(?<=^|[^A-Za-z0-9_.+@-])[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/"

重要なことは、否定後読みの後に「メール境界」として機能する先読みを使用することでした。

于 2011-07-22T16:15:49.167 に答える