web-dev-qa-db-ja.com

PHP preg_match()を介して複数行パターンに一致する

このHTMLコードでPHP preg_match()正規表現パターンを介してsubject)を照合するには

      <table border=0>
  <tr>
  <td>


  <h2>subject</h2>



    </td>

すべての空白と改行は意図的に残されています。したがって、問題は複数の行パターンを使用してサブジェクト名を抽出することです。

28

(たとえば)ネストされたh2タグを探している場合within 2つの間に空白のみがあるtdタグは、単に\sを使用してください。スペース、改行などが含まれます。例::

preg_match('#<td>\s*<h2>(.*?)</h2>\s*</td>#i',$str,$matches);
// result is in $matches[1]

実際にご覧ください here

興味のある方のために、 herepreg_*関数に渡すことができるさまざまな修飾子のリストです。興味のあるフラグは次のとおりです。

  • s( "dotall"):これにより、.がすべての文字に一致します。含む改行。したがって、<h2>.....</h2>が複数の行に広がっていたとしましょう。その後、あなたはしなければならないだろう

    preg_match('#<td>\s*<h2>(.*?)</h2>\s*</td>#is',$str,$matches);
    

    .*が複数行にわたるようにするために(正規表現の最後にある余分なsを参照してください?)。

  • m( "multiline"):これは、^$の開始/終了を単に開始/終了の代わりにlineに一致させるだけです。 string。パターンで^$を使用していて、入力の個々の行の開始/終了と一致させたい場合にのみ本当に必要です。
55

正規表現にm演算子を追加できます。

// Given your HTML content.
$html = 'Your HTML content';
preg_match('/<td[^>]*>(.*?)<\/td>/im', $html, $matches);

これが(まだ)助けてくれることを願っています(笑)。

13
Saul Martínez

とてもシンプルに

preg_match('/<h2>(.*?)<\\/h2>/', $str, $matches);
print($matches[1]);

複数行にわたる文字列と一致させる必要がない限り、複数行形式は正規表現に影響を与えません。

3
Borodin

HTMLコンテンツの解析に正規表現を使用しないでください。ユーザーが入力できるものを制御できない場合、多くの問題が発生する可能性があります。すべての言語に、より優れたソリューションがたくさんあります。ほとんどの場合、XMLパーサーはより良い仕事をしています。 DOMDocumentsimplehtmldom または php-html-parser をご覧ください

HTMLコンテンツで正規表現を使用しない理由については、こちらをご覧ください。RegExは、XHTML自己完結型タグを除く開始タグと一致します

1
Maciej Paprocki