我在寫一個涉及到抓取網頁的php腳本。目前,該腳本分析了線的頁面線,但它通過刪除所有換行符打破,如果有跨多行標籤,像如何確定一個html標籤是否分割成多行
<img src="example.jpg"
alt="example">
如果糟糕來糟糕的是,我可能預處理網頁,然後將它們重新插入最接近的>
,但這看起來像是一團糟。
理想情況下,我將能夠檢測跨線的標記,只將這些標記與線結合,然後繼續處理。
那麼檢測這個最好的方法是什麼?
我在寫一個涉及到抓取網頁的php腳本。目前,該腳本分析了線的頁面線,但它通過刪除所有換行符打破,如果有跨多行標籤,像如何確定一個html標籤是否分割成多行
<img src="example.jpg"
alt="example">
如果糟糕來糟糕的是,我可能預處理網頁,然後將它們重新插入最接近的>
,但這看起來像是一團糟。
理想情況下,我將能夠檢測跨線的標記,只將這些標記與線結合,然後繼續處理。
那麼檢測這個最好的方法是什麼?
也許對於未來的項目我會使用一個解析庫,但是這只是一個問題。這是我目前的解決方案。 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);
}
}
這很可能以某種方式得到優化,但對於我而言,這是不夠的。
好了,這不回答這個問題,更多的是一種意見的,但是......
我認爲最好的策略刮(因此,要解決這個問題)是不是要分析一個HTML一行一行,這對HTML來說是不自然的,但要通過它的自然分隔符來分析它:<>對。
將有兩種類型的課程:
您可以立即看到在使用段落(p)標記的情況下使用此策略的優點:解析多段線段而不必跟蹤結束標記的位置會更容易。
這是我的一個寵物小偷:從來沒有手工解析HTML。 從不用正則表達式解析HTML。 從不用字符串比較解析HTML。 總是用使用一個HTML解析器來解析HTML - 這就是它們的用途。
自從我做了任何PHP之後已經很長時間了,但快速搜索出現了this PHP5 HTML parser。
不要寫一個解析器,使用別人的:DOMDocument::loadHTML - 這只是一個,我認爲還有很多其他的。
爲什麼不讀一行,並將其設置爲字符串,然後檢查字符串是否打開和關閉標籤,如果標籤跨越多於一行,則將下一行添加到字符串並移動零件在開口大括號之前加上你的加工字符串。然後解析完整個文件。它不漂亮,但它應該工作。
如果您必須堅持使用當前的解析方法,並且它是一個正則表達式,那麼可以使用「m」跨越多行。