-2

重複の可能性:
PHP で HTML を解析および処理する方法は?

問題:

preg_match を使用して Web ページから最初の < ul class="list">< /ul> のみを抽出し、配列にダンプします。

コード:

$str = file_get_contents('http://www.domain.com');
preg_match('#<ul class="list">(.*)</ul>#i', $str, $matches);

望ましい目標:

最初の < ul> を取得し、それをすべて配列にダンプします。< ul> は親であり、内部のすべての要素は子である必要があります。

4

3 に答える 3

0

preg_matchは文字列操作関数であり、「子要素」について何も知らないため、期待する配列を返すことはできません。

Simple HTML DOMや組み込み DOM ライブラリのloadHTML メソッドなど、HTML を解析できるライブラリを使用する必要があります。

[編集- 上記の「決して」は少し誇張されています。少し努力すればpreg_match、 だけを使用して独自のミニパーサーを作成できますが、HTML 解析ライブラリを使用する場合と比較して、柔軟性がなく、保守も困難です。]

于 2012-10-17T18:03:06.840 に答える
0
$str = file_get_contents('http://www.domain.com');
preg_match('~<ul class="list">(.*?)</ul>~si', $str, $matches);

使用する 。? 最初で最も近い終了タグに一致します。を使用する場合。ページで最初に見つかります。あなたのULタグは正しいと思います。

s = single-linei = insensitiveのようにsi フラグも必要です。そうしないと、最初の \n でパターンが壊れます。

PS : UL に UL の子が含まれている場合は、DOMDocumentDOMXPathクエリを使用して解析することを検討する必要があります。より複雑な HTML ではより安全です。

それが役に立てば幸い。

于 2012-10-17T18:04:24.990 に答える
0

.+ を使いたいですか? または、複数ある場合は、最初の ul 以外を取得することもできます。

preg_match( '/<ul class="list">(.+?)<\/ul>/mis', $str, $match );

preg_match_all( '/<li>(.+?)<\/li>/mis', $match[1], $lis );

$answer = array ( 'ul' => $lis[1] );

それがあなたが探していたものだと思います

于 2012-10-17T18:05:26.170 に答える