0

正規表現を使用しているときに問題が発生しました:

php> $html = "<html><head><body><h1>hello world</h1><img src=\"data:rawIMGdata\" /><p/><img src=\"sdfsdf.jpg\" title=\"pic1\" /><p/><div class=\"myclass\"><img src=\"data:imageData\" /></div><img alt=\"bla\" src=\"bla.jpg\" title=\"bla\" /></body></html>";
php> $pat = '/<img.*src="(data:.*)"/m';
php> preg_match_all($pat, $html, $matching);
php> var_dump($matching);
array(2) {
  [0]=>
  array(1) {
    [0]=>
    string(169) "<img src="data:rawIMGdata" /><p/><img src="sdfsdf.jpg" title="pic1" /><p/><div class="myclass"><img src="data:imageData" /></div><img alt="bla" src="bla.jpg" title="bla""
  }
  [1]=>
  array(1) {
    [0]=>
    string(63) "data:imageData" /></div><img alt="bla" src="bla.jpg" title="bla"
  }  
}

私の予想される出力は、2 番目の配列に "data:imageData" が出現するだけで、さらに 2 つの一致 ("data:rawIMGdata") が存在するはずです。

正規表現を間違った方法で定義しましたか?

よろしく、ブロンコ

4

4 に答える 4

1

あなたは基本的に、あまりにも多くの情報を取得するように PCRE に指示しています。正規表現のマッチング演算子は可能な限り一致します。これが、一致に多くの余分なものを取得する理由です。最初に、最初の空白の一致、または要素の内容の一致に貪欲でないバリアントの使用に切り替えます。次に、属性の内容の最後に一致する適切な区切り文字を導入します。使用すべきパターンは次のとおりです。

$pat = '/<img.*?src="(data:[^"]*)"/m';
于 2012-11-22T09:32:49.200 に答える
1

HTML の解析に DOM Document を使用することを検討することもできますが、この例がこれから複雑になる場合は、おそらく正規表現を使用できます。ただし、DOM ドキュメントは常により堅牢になります。

これを試して:

/<img.*?src="(data:[^"]*)"/m

? * を貪欲でないように設定します(したがって、最小の一致が取得されます。デフォルトでは、可能な限り取得します)

また、何にでも一致するのではなく、" with [^"] 以外のすべてに一致させることができます。

.* 前は貪欲で、別の要素の " まで一致していました

于 2012-11-22T09:27:44.033 に答える
1

有効な (ほぼ有効な) HTML を解析しようとしている場合は、XML を解析するためだけのツールを使用してみてください。これにより、XML を非常に効果的DOMにブラウズできます。

RegExpは間違いなく仕事をしますが、スワップ'または"htmlの変更を<img src="">行う<img class="" src="">と、問題が発生する可能性があります。

XML 解析ユーティリティは、通常、引数のエスケープと「エスケープ解除」にも注意を払い、重複した引数を処理します。

使用例DOMxPath(ここでは[tutorial]):

$doc = new DOMDocument;
$doc->Load('book.xml');
$xpath = new DOMXPath($doc);
$query = '//img';

$entries = $xpath->query($query);

foreach ($entries as $entry) {
    if( !$entry->hasElement('src')){
        continue;
    }

    $src = $entry->getAttribute( 'src');

    if( strncmp( $src, 'data:', 5) != 0){
       continue;
    }

    $content = substr( $src, 5);

    // Do whatever you need
}
于 2012-11-22T09:39:15.270 に答える
0

「怠惰な」表現を使ってみてください -

$pat = '/<img(.*?)src="(data:.*)"/m';

詳細: http://www.regular-expressions.info/repeat.html

于 2012-11-22T09:32:27.713 に答える