1

次の正規表現に基づいてWebページで一致を取得したい:(。*)regexpal.com(オンライン正規表現テストツール)でテストしましたが、正常に動作します。ただし、phpで使用すると、一致するものが見つかりません。私がphpで使用するステートメントは

preg_match_all("/<a href=\"\/title\/.*\/\">(.*)<\/a>/", $content, $matches);

$contentを確認しました。正しいです。それで、私の声明から何か問題がありますか?ありがとう!

4

3 に答える 3

7

お願いします...神の愛のために、URLまたはHTMLを扱う正規表現を/でラップしないでください。あなたはあちこちでそれを脱出する必要があります。それはひどいです。ここを見て:

preg_match_all('~<a href="/title/[^">]+/">(.*?)</a>~si', $content, $matches);
  1. 一重引用符。二重引用符をエスケープする必要がなくなりました。拡張可能な「{$variables}」がないのに、なぜ二重引用符を使用するのでしょうか。
  2. RegExpを予約されていない文字にラップします。URLとHTMLの場合、冗長性の地獄から逃れるために/は最悪の選択です。
  3. タグは複数行および。+になる可能性があるため、HTMLのフラグとして「si」を使用します。また 。*?デフォルトでは複数行に一致します。そして、大文字と小文字を区別しない必要があります。
  4. 。+の使用を避けますか?属性で。タグ全体をキャプチャできます。ブレーク文字も追加します。上記の私のパターンを参照してください...HTMLが壊れている場合でもやりすぎないようにしてください。

これを改善する方法は他にもありますが、これでうまくいくはずです。

それが役に立てば幸い。

于 2012-10-19T19:15:23.390 に答える
1

?>>を追加して、正規表現パターンを怠惰(貪欲ではない)にする必要があります。

preg_match_all("/<a href=\"\/title\/.*?\/\">(.*?)<\/a>/", $content, $matches);
于 2012-10-19T18:50:45.590 に答える
0
preg_match_all("/<a href\=\"\/title\/.*\/\">(.*?)<\/a>/", $content, $matches);

私は試してみます:

preg_match_all('/<a href\=".title.*">(.*?)<\/a>/', $content, $matches);

簡潔にするため。

于 2012-10-19T18:47:38.150 に答える