【问题标题】:How to determine if an html tag splits across multiple lines如何确定html标签是否跨多行拆分
【发布时间】:2010-09-07 05:20:59
【问题描述】:

我正在编写一个涉及抓取网页的 PHP 脚本。目前,该脚本逐行分析页面,但如果存在跨越多行的标签,则它会中断,例如

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

如果情况变得更糟,我可能会通过删除所有换行符来预处理页面,然后在最近的&gt; 处重新插入它们,但这似乎是一个杂项。

理想情况下,我能够检测到跨行的标签,仅将这些标签与行合并,然后继续处理。
那么最好的检测方法是什么?

【问题讨论】:

    标签: php html scripting


    【解决方案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);
        }
    }
    

    这可能会以某种方式进行优化,但就我而言,这已经足够了。

    【讨论】:

      【解决方案2】:

      如果您必须坚持当前的解析方法,并且它是一个正则表达式,您可以使用 multi-line flag "m" 跨越多行。

      【讨论】:

        【解决方案3】:

        你为什么不读一行,并将其设置为一个字符串,然后检查字符串的标签开头和结尾,如果标签跨越多行,则将下一行添加到字符串中并移动之前的部分已处理字符串的左大括号。然后只需解析整个文件即可。它不漂亮,但它应该可以工作。

        【讨论】:

          【解决方案4】:

          不要编写解析器,使用别人的:DOMDocument::loadHTML - 这只是一个,我认为还有很多其他的。

          【讨论】:

            【解决方案5】:

            这是我最讨厌的事情之一:从不手动解析 HTML。 从不 使用正则表达式解析 HTML。 从不 用字符串比较解析 HTML。 总是使用 HTML 解析器来解析 HTML - 这就是他们的目的。

            我已经很久没有做任何 PHP 了,但是快速搜索出现了 this PHP5 HTML parser

            【讨论】:

              【解决方案6】:

              嗯,这并不能回答问题,更多的是一种意见,但是......

              我认为最好的抓取策略(因此,消除这个问题)不是逐行分析 HTML,这对 HTML 来说是不自然的,而是通过其自然分隔符来分析它: 对。

              课程分为两种:

              • 立即关闭的标记元素,例如,
              • 标记需要单独结束标记的元素,例如

                文本

              您可以立即看到在段落(p)标签的情况下使用此策略的优势:解析多行段落将更容易,而不必跟踪结束标签的位置。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-02-05
                • 1970-01-01
                • 1970-01-01
                • 2020-04-08
                • 2017-05-01
                相关资源
                最近更新 更多