このHTMLコードでPHP preg_match()正規表現パターンを介してsubject)を照合するには
<table border=0>
<tr>
<td>
<h2>subject</h2>
</td>
すべての空白と改行は意図的に残されています。したがって、問題は複数の行パターンを使用してサブジェクト名を抽出することです。
(たとえば)ネストされたh2
タグを探している場合within 2つの間に空白のみがあるtd
タグは、単に\s
を使用してください。スペース、改行などが含まれます。例::
preg_match('#<td>\s*<h2>(.*?)</h2>\s*</td>#i',$str,$matches);
// result is in $matches[1]
実際にご覧ください here 。
興味のある方のために、 here はpreg_*
関数に渡すことができるさまざまな修飾子のリストです。興味のあるフラグは次のとおりです。
s
( "dotall"):これにより、.
がすべての文字に一致します。含む改行。したがって、<h2>.....</h2>
が複数の行に広がっていたとしましょう。その後、あなたはしなければならないだろう
preg_match('#<td>\s*<h2>(.*?)</h2>\s*</td>#is',$str,$matches);
.*
が複数行にわたるようにするために(正規表現の最後にある余分なs
を参照してください?)。
m
( "multiline"):これは、^
と$
の開始/終了を単に開始/終了の代わりにlineに一致させるだけです。 string。パターンで^
と$
を使用していて、入力の個々の行の開始/終了と一致させたい場合にのみ本当に必要です。正規表現にm
演算子を追加できます。
// Given your HTML content.
$html = 'Your HTML content';
preg_match('/<td[^>]*>(.*?)<\/td>/im', $html, $matches);
これが(まだ)助けてくれることを願っています(笑)。
とてもシンプルに
preg_match('/<h2>(.*?)<\\/h2>/', $str, $matches);
print($matches[1]);
複数行にわたる文字列と一致させる必要がない限り、複数行形式は正規表現に影響を与えません。
HTMLコンテンツの解析に正規表現を使用しないでください。ユーザーが入力できるものを制御できない場合、多くの問題が発生する可能性があります。すべての言語に、より優れたソリューションがたくさんあります。ほとんどの場合、XMLパーサーはより良い仕事をしています。 DOMDocument 、 simplehtmldom または php-html-parser をご覧ください
HTMLコンテンツで正規表現を使用しない理由については、こちらをご覧ください。RegExは、XHTML自己完結型タグを除く開始タグと一致します