0

欲張りでない正規表現ステートメントを書き込もうとして問題が発生しました。

これが私の文字列です:

<strong>name</strong><strong>address</strong>mailto:blabla@email.com

これが私の正規表現クエリです:

<strong>(.*?)</strong>.*?([A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4})

問題は、文字列の名前ではなく、アドレスが必要なことです。したがって、正規表現クエリは欲張りでは<strong></strong>なく、最も遠いのではなく最も近いものにする必要があります。

.*また、検索文字列にはこれの複数のインスタンスがあるため、その前に(貪欲な)ものを追加するのではなく、一度に複数のインスタンスに一致させる必要があります。

したがって、これのすべてのインスタンスと一致し、名前ではなくアドレスをプルする必要があります。

   <strong>name</strong><strong>address1</strong>mailto:blabla@email.com
   <strong>name</strong><strong>address2</strong>mailto:blabla@email.com
   <strong>name</strong><strong>address3</strong>mailto:blabla@email.com
   <strong>name</strong><strong>address4</strong>mailto:blabla@email.com

前もって感謝します!

4

3 に答える 3

2

まず、正規表現はHTMLを照合するための最適ではないツールです(これがその理由の良い例です)。パーサーの使用方法を知っていれば、パーサーの方が幸せです(おそらく、PHPの達人の1人がパーサーを推奨できます)。

そうは言っても、正規表現を使用するより良い方法は、おそらく最初の<strong>タグを明示的に一致させる(そして破棄する)ことです。

<strong>.*?</strong><strong>(.*?)</strong>.*?([A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4})

これは決して優れた、信頼性の高い、防弾ソリューションではありませんが、少なくともサンプルデータに対しては機能します。

または、関連するタグの間/後に許可される内容についてより具体的にできる場合は、次のようにします。

<strong>([^<>]*)</strong>(?:mailto:)?([A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4})
于 2011-03-21T20:00:59.227 に答える
0

HTMLの解析に正規表現を使用しないでください。

http://htmlparsing.com/php.htmlを参照してください

于 2011-03-21T20:56:15.780 に答える
0

テストデータを見て、私が推測するルールは次のとおりです。

  1. 名前と住所は両方とも強力な要素で囲まれており、メールはすぐに続きます。
  2. STRONG要素の属性、名前、およびアドレスにはすべて山かっこがなく、かつ
  3. mailto:メールアドレスコンポーネントは常に、ANDで始まります
  4. 2つのSTRONG要素内に他のHTML要素はありません。

次に、このテストされたコードでうまくいくはずです。

$re = '%
    # Capture name and address in <strong> element then email.
    <strong[^>]*>\s*([^<>]+)</strong\s*>\s*  # $1: Name.
    <strong[^>]*>\s*([^<>]+)</strong\s*>\s*  # $2: Address.
    (mailto:\S+)                             # $3: Email.
    %ix';
$count = preg_match_all($re, $text, $matches);
if ($count) {
    printf("%d matches found:\n", $count);
    print_r($matches);
    for ($i = 0; $i < $count; ++$i) {
        printf("Match %d: Name: \"%s\", Address: \"%s\", Email: \"%s\":\n",
            $i + 1, $matches[1][$i], $matches[2][$i], $matches[3][$i]);
    }
} else {
    printf("No matches found.\n");
}
于 2011-03-21T21:28:22.267 に答える