5

$contentという変数で次を返すスクリプトがあります

<body>
<p><span class=\"c-sc\">dgdfgdf</span></p>
</body>

ただし、matchesと呼ばれる配列内のbodyタグの間にすべてを配置する必要があります

bodyタグ間の内容を一致させるために次のことを行います

preg_match('/<body>(.*)<\/body>/',$content,$matches);

しかし、$ mathces配列は空です。どうすれば、bodyタグ内のすべてを返すことができますか?

4

3 に答える 3

12

正規表現でhtmlを処理しようとしないでください!代わりに、PHPの組み込みパーサーを使用してください。

$dom = new DOMDocument;
$dom->loadHTML($string);
$bodies = $dom->getElementsByTagName('body');
assert($bodies->length === 1);
$body = $bodies->item(0);
for ($i = 0; $i < $body->children->length; $i++) {
    $body->remove($body->children->item($i));
}
$string = $dom->saveHTML();
于 2010-02-02T09:08:04.007 に答える
10

HTMLの解析に正規表現を使用しないでください。

この場合の特定の問題は、ドットが改行と一致するようにDOTALL修飾子を追加する必要があることです。

preg_match('/<body>(.*)<\/body>/s', $content, $matches);

しかし、真剣に、代わりにHTMLパーサーを使用してください。上記の正規表現が壊れる可能性のある方法はたくさんあります。

于 2010-02-02T09:05:26.413 に答える
2

何らかの理由でDOMDocumentがインストールされていない場合は、これを試してください

ステップ1.simple_html_domをダウンロードします

ステップ2.セレクターの使用方法に関するドキュメントを読む

require_once("simple_html_dom.php");
$doc = new simple_html_dom();
$doc->load($someHtmlString);
$body = $doc->find("body")->innertext;
于 2010-02-02T09:17:31.570 に答える