0

問題:作成者がCMSに誤って電子メールアドレスを追加しました-「mailto:」テキストが欠落しています。

保存されているMySQLコンテンツテーブルで検索と置換を行うには、可能であれば正規表現が必要です。

私が対処する必要があるケースは次のとおりです。

  1. 「mailto:」はありません
  2. 'mailto:'はすでに含まれています(正しい)
  3. 電子メールではなくWebアドレス-置換なし
  4. 複数のmailto:必須(文字列に複数)

サンプル文字列は次のようになります:(読みやすくするために改行が追加されています)

<a href="add1@test.com">add1@test.com</a> and
<a href="mailto:add2@test.com">add2@test.com</a> and
<a href="http://www.test.com/">real web link</a>
second one to replace <a href="add3@test.com">add3@test.com</a>

必要な出力は次のとおりです。

<a href="mailto:add1@test.com">add1@test.com</a> and
<a href="mailto:add2@test.com">add2@test.com</a> and
<a href="http://www.test.com/">real web link</a>
second one to replace <a href="mailto:add3@test.com">add3@test.com</a>

私が試したこと(PHPで)と問題:

pattern:   /href="(.+?)(@)(.+?)(<\/a> )/iU
replacement:    href="mailto:$1$2$3$4

これは、mailto:を正しくフォーマットされたmailto:に追加し、最後の2つのリンクに対して貪欲に行動します。

助けてくれてありがとう。調べてみましたが、予期しないコンテンツの問題であったため、時間が不足しています。

あなたが私に時間を節約してSQL式を与えることができれば、それはさらに良いでしょう。

4

3 に答える 3

1

交換してみてください

/href="(?!(mailto:|http:\/\/|www\.))/iU

href="mailto:

?!大まかに「次のキャラクターはこれらではない」という意味です。

別:

交換

/(href=")(?!mailto:)([^"]+@)/iU

$1mailto:$2

[^"]+ではない1つ以上の文字を意味し"ます。

正確性を保証するには、おそらくより複雑なマッチングパターンが必要になります。

MySQL REGEXマッチング:

これまたはこれを参照してください。

于 2013-02-13T10:29:08.750 に答える
1

最初に適切なメールパターンを適用する必要があり(例:正規表現を使用してメールアドレスを検証するmailto:)、2番目にメールの前または何も検索し ない(例:) (mailto:|)、最後preg_replace_callbackにこれに適合します。

これは希望どおりに機能しているように見えます(二重引用符で囲まれた電子メールアドレスのみを検索します)。

$s = '<a href="add1@test.com">add1@test.com</a> and 
<a href="mailto:add2@test.com">add2@test.com</a> and 
<a href="http://www.test.com/">real web link</a> 
second one to replace <a href="add3@test.com">add3@test.com</a>';
echo preg_replace_callback(
    '~"(mailto:|)([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4}))"~i', 
    function($m) {
        // print_r($m); @debug
        return '"mailto:'. $m[2] .'"';
    },
    $s
);

必要に応じて出力します。

<a href="mailto:add1@test.com">add1@test.com</a>および
<a href="mailto:add2@test.com">add2@test.com</a>および
<ahref="http://www.test.com/">実際のウェブリンク</a>
<a href="mailto:add3@test.com">add3@test.com</a>を置き換える2番目のもの
于 2013-02-13T10:46:06.303 に答える
0

パターンとして以下を使用します。

/(href=")(?!mailto:)(.+?@.+?")/iU

と置き換えます

$1mailto:$2

(?!mailto:)mailto:が続くかどうかをチェックする否定的な先読みです。そのようなものがない場合は、残りの部分が一致しているかどうかがチェックされます。1つ以上の文字、それに続く1つ以上の文字、それに続く。(.+?@.+?")に一致します。どちらも欲張りではありません。@"+

href="一致したパターンは、最初のキャプチャグループ( )、mailto:続いて2番目のキャプチャグループ(終了まで)に置き換えられ"ます。

于 2013-02-13T10:28:39.480 に答える