質問

Web ページのスクレイピングを含む PHP スクリプトを作成しています。現在、スクリプトはページを 1 行ずつ分析しますが、次のような複数行にまたがるタグがある場合は中断されます。

<img src="example.jpg"
alt="example">

最悪の場合は、すべての改行を削除してページを前処理し、最も近い位置に改行を再挿入することもできます。 >, 、しかし、これはクラッジのように思えます。

理想的には、複数の行にまたがるタグを検出し、それらのタグのみを行に結合して、処理を続行できるようになります。
では、これを検出する最良の方法は何でしょうか?

役に立ちましたか?

解決 4

おそらく将来のプロジェクトでは解析ライブラリを使用することになるでしょうが、それは当面の質問とは別の話になります。これが私の現在の解決策です。 rstrpos strpos ですが、逆方向からです。使用例:

for($i=0; $i<count($lines); $i++)
{
    $line = handle_mulitline_tags(&$i, $line, $lines);
}

そして、その実装は次のとおりです。

function rstrpos($string, $charToFind, $relativePos)
{
    $searchPos = $relativePos;
    $searchChar = '';

    while (($searchChar != $charToFind)&&($searchPos>-1))
    {
        $newPos = $searchPos-1;
        $searchChar = substr($string,$newPos,strlen($charToFind));
        $searchPos = $newPos;
    }

    if (!empty($searchChar))
    {
        return $searchPos;
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

function handle_multiline_tags(&$i, $line, $lines)
{
    //if a tag is opened but not closed before a line break,

    $open = rstrpos($line, '<', strlen($line));
    $close = rstrpos($line, '>', strlen($line));
    if(($open > $close)&&($open > -1)&&($close > -1))
    {
        $i++;
        return trim($line).trim(handle_multiline_tags(&$i, $lines[$i], $lines));
    }
    else
    {
        return trim($line);
    }
}

これはおそらく何らかの方法で最適化できるでしょうが、私の目的にはこれで十分です。

他のヒント

これは私の不満の 1 つです。 一度もない 手動で HTML を解析します。 一度もない 正規表現を使用して HTML を解析します。 一度もない 文字列比較を使用して HTML を解析します。 いつも HTML パーサーを使用して HTML を解析する - それがその目的です。

PHPを使うのは久しぶりですが、ちょっと検索してみたら出てきました この PHP5 HTML パーサー.

パーサーを作成せず、他の人のパーサーを使用してください。 DOMDocument::loadHTML - それはほんの 1 つで、他にもたくさんあると思います。

まあ、これは質問の答えではなく、むしろ意見ですが...

私は、最良のスクレイピング戦略 (そして結果的にこの問題を排除する) は、HTML を 1 行ずつ分析することではなく、HTML にとって不自然なことではなく、自然な区切り文字によって分析することだと思います。<> ペア。

もちろんコースは2種類になります。

  • すぐに閉じられるタグ要素 (例: < br />)
  • 別の終了タグが必要なタグ要素 (例: < p > text </p >)

段落(p) タグの場合、この戦略を使用する利点がすぐにわかります。終了タグがどこにあるかを追跡する必要がなく、複数行の段落を解析する方が簡単になります。

行を読み取って文字列に設定し、その文字列でタグの開始と終了を確認してみてはいかがでしょうか。タグが複数行にまたがる場合は、次の行を文字列に追加し、その部分を左中括弧の前に移動します。処理された文字列に。次に、これを実行してファイル全体を解析するだけです。美しくはありませんが、機能するはずです。

現在の解析方法に固執する必要があり、それが正規表現である場合は、 複数行のフラグ 「m」は複数行にまたがる場合に使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top