1

HTML のブロックがあり、特定のノードと子ノード (たとえば下のブロック) の正確な HTML コンテンツを取得したい場合、コンテンツまたはDOM Parsing<ul>のようなものを使用preg_matchまたは解析する必要がありますか?

入力

<html>
<head>
</head>
<body>
<h2>List</h2>
<ul class="my-list" id="my-list">
    <li class="item first">item1</li>
    <li class="item second">item2</li>
    <li class="item third">item3</li>
</ul>
</body>
</html>

望ましい出力

<ul class="my-list" id="my-list">
    <li class="item first">item1</li>
    <li class="item second">item2</li>
    <li class="item third">item3</li>
</ul>

ご覧のとおり、すべての属性 (クラス、ID など) を保持したいと考えています。

DOM構文解析を使用すると、これらの属性 ( ) のすべてにアクセスできることはわかっています$items->item($i)->getAttribute('class')が、DOM は、手動でループして HTML を構築することなく、元のコードの一部だけを簡単に (そして自動的に) 再構築できますか? (私は持っていることを知っDOMていますがecho $DOM->saveXML()、それはページ全体のためのものだと思います.

正規表現と PHP を使用してこれをかなり簡単に達成する方法は知っていますが、それは良い習慣ではないと考えています。

これは jQuery を使用するととても簡単です。

jQuery('ul').clone()

PHPで同じことを達成するにはどうすればよいですか? (リモート HTML を取得し、DOM を使用してそのスライスを取得し、再度 HTML として出力します)

4

3 に答える 3

2

dom関数ではそれほど悪くはありませんが、おそらく、本来よりも少し冗長です。

$dom = new DOMDocument();
@$dom->loadHTML($html);
# or 
# @$dom->loadHTMLFile($url);
$xpath = new DOMXPath($dom);
echo $dom->saveXML($xpath->query("//ul")->item(0));
于 2012-04-29T09:00:48.883 に答える
1

DOM解析を使用することをお勧めします。これは、HTML構造が変更された場合に保守が容易になり、正規表現よりも理解(コードの読み取り)が容易になるためです。

于 2012-04-28T03:28:20.830 に答える
0

これは、データソースをどれだけ信頼するかによって異なります。一貫性がありますか?マークアップにエラーがありますか?あなたは何を期待するか知っていますか?

サンプルと同じくらい単純または比較的近い場合、ここで正規表現が完全に有効な選択ではない理由はわかりません。

たとえば、が複数ある場合は、さらに難しくなります<ul>。それを一意に識別する何かがあるか、それが常に同じ順序である限り、それは問題ではありません。

于 2012-04-28T03:25:20.710 に答える