我在写一个涉及到抓取网页的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”跨越多行。