0

私はこれを複雑にしすぎているに違いありませんが、私の人生では理解できません。

文字列として保存されている標準の html ドキュメントがあり、段落の内容を取得する必要があります。事例を作ってみます。

$stringHTML=
"<html>

<head>
<title>Title</title>
</head>

<body>

<p>This is the first paragraph</p>
<p>This is the second</p>
<p>This is the third</p>
<p>And fourth</p>

</body>
</html>";

私が使用する場合

$regex='~(<p>)(.*)(</p>)~i';
preg_match_all($regex, $stringHTML, $newVariable); 

4 結果が出ません。むしろ、10 を取得します。正規表現が 1 番目<p>と 1 番目、および 1</p>番目<p>と 4 番目に一致するため、10 を取得します。</p>

2 つの単語の間を検索し、各段落の間の結果のみを返すにはどうすればよいですか?

4

3 に答える 3

1

HTML を解析するには、DOM や XPATH などの HTML パーサーを使用します。HTML の解析に正規表現を使用しないでください。DOMDocument で簡単に解析する方法を次に示します。

$doc = new \DOMDocument;
$doc->loadHTML($stringHTML);
$ps = $doc->getElementsByTagName("p");
for($i=0;$i<$ps->length; $i++){
    echo $ps->item($i)->textContent. "\n";
}

実際のコード


この正規表現を使用すると(正規表現の練習であると言ったように)、4つの結果が得られます。

preg_match_all("#<p>(.*)</p>#", $stringHTML, $matches);
print_r($matches[1]);

ここでは、ルックアラウンド構文が使用されています。実際のコードをご覧ください。

于 2013-01-01T06:13:34.440 に答える
0

.*?最長一致ではなく最短一致を取得するために使用します。

于 2013-01-01T04:51:09.947 に答える
0

あなたの正規表現は/<p>(.*?)<\/p>/i. 間の文字列のみに一致<p></p>し、配列に入れます。

グループを行うべきではありません:(<p>)

于 2013-01-01T05:59:57.883 に答える