2008-08-29 4 views
3

私はWebページのスクラップを含むPHPスクリプトを作成しています。現在、このスクリプトは、ラインによるページの行を分析しますが、複数行にまたがるタグはhtmlタグが複数の行にまたがっているかどうかを調べるには

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

のように、存在する場合より悪いが、私はすべての改行を削除することでページを前処理おそらく、さらに悪化する可能性が来ればそれが壊れ、最も近い>にそれらを再挿入するが、これはkludgeのように思える。

理想的には、行間にまたがるタグだけを検出し、行間に結合して処理を続けることができます。
これを検出する最も良い方法は何ですか?

答えて

1

おそらく将来のプロジェクトでは、解析ライブラリを使用しますが、それは手元の質問とは別のものです。これは私の現在の解決策です。 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では不自然ですが、その自然な区切り文字:<>ペアで解析することができます。

コースの2種類があります

  • すぐに閉鎖されているタグの要素、例えば、個別の終了タグが必要< BR />
  • タグ要素、例えば、< P>テキスト</p>

段落(p)タグの場合は、この戦略を使用する利点がすぐにわかります。終了タグの位置を追跡するのではなく、段落の解析が簡単になります。

7

これは私のペットのかわいこの1つです。決して手作業でHTMLを解析します。 正規表現でHTMLを解析します。 しない文字列を比較してHTMLを解析します。 常には、HTMLパーサーを使用してHTMLを解析します。これはそのためのものです。

私はPHPを何度もやっていますが、すばらしい検索はthis PHP5 HTML parserです。

2

パーサーを書いてはいけません。他の人のものを使用してください:DOMDocument::loadHTML - それは単なるものですが、他にもたくさんあると思います。

0

文字列に設定して文字列を設定してから、タグの開始と終了の文字列をチェックしてください。タグが複数の行にまたがる場合は、文字列に次の行を追加し、あなたの処理された文字列に開きブレースの前に。次に、これを行うファイル全体を解析します。美しくないが、うまくいくはずだ。

0

現在の解析方法に固執する必要があり、それが正規表現ならば、multi-line flag "m"を複数の行にまたがることができます。

関連する問題