0

特定のもの(リンクなど)のためにWebページをスクレイピングするときに役立つ機能があります。

function list_tags($html, $start, $end)
{
    preg_match_all("($start(.*)$end)siU", $html, $matching_data);
    return $matching_data[0];
}

使用例:

$open_tag  = '<a';
$close_tag = '>';
$links     = list_tags($html, $open_tag, $close_tag);

したがって、次のようprint_r($links);になります。

Array
(
    [0] => <a href="blah.html">
    [1] => <a href="other_blah.html">
    Etc...
    Etc...
)

$open_tag = '<script';or などを使用すると同じことができますが、 $open_tag = '<div';使用しようとすると、ページにいくつかのタグ$open_tag = '<input';があるにもかかわらず、配列が完全に空になります。<input>何か案は?

編集:

私がこすり取ろうとしている特定のページはhttp://www.pcsoweb.com/inmatebooking/Inquiry.aspx. 自分で作成したページで同じことを使用したところ、`<input ... />作成したすべての出現箇所が見つかりました。

<input />この特定のサイトでタグを取得するのを妨げている原因を突き止めるには、さらに深く掘り下げる必要があります。

また、これがより良い結果をもたらすかどうかを確認するために、DOMDocumentクラスを調べます。

提案、doublesharpfeelaに感謝します。本当の問題が何であるかを確認するために、これをもう少し詳しく調べます。

4

2 に答える 2

2

DOM パーサーを使用することをお勧めしますが、正規表現を使用してデータを解析する必要がある場合は、 and/の代わりに区切り文字として使用して、コードを読みやすくし、一致するグループを遅延させます(修飾子を削除します)。()?U

function list_tags($html, $start, $end)
{
    // escape forward slashes in your pattern start and end
    $start = str_replace("/", "\/", $start);
    $end   = str_replace("/", "\/", $end);
    preg_match_all("/{$start}(.*?){$end}/si", $html, $matching_data);
    return $matching_data[0];
}

$html = "<input test='test'><a href='asdf'>";
$open_tag  = '<(input|a)';
$close_tag = '>';
$links     = list_tags($html, $open_tag, $close_tag);
print_r($links); 

このコードを実行すると、次のようになります。

Array
(
    [0] => <input test='test'>
    [1] => <a href='asdf'>
)
于 2012-10-24T14:39:02.773 に答える
0

あなたの正規表現(<input(.*)>)siUhttp://www.functions-online.com/preg_match_all.htmlに貼り付けると

<a>dfg</a><input type="sdgf"/>

注意すべきことの 1 つは、/>(自己終了) で終わる入力です。設定に何か問題があると、それが見つからない可能性がありますか?

HTML サンプルがないと、なんとも言えません。

于 2012-10-24T14:55:40.823 に答える