需要帮助修改函数(正则表达式)

时间:2011-03-12 10:50:14

标签: php regex

我正在使用Webbots,Spiders和Screen Scrapers一书中的parse_array函数来解析我的解析需求。但是我需要修改这个函数,我不知道如何。

功能:

    function parse_array($string, $beg_tag, $close_tag)
    {
    preg_match_all("($beg_tag(.*)$close_tag)siU", $string, $matching_data);
    return $matching_data[0];
    }

工作原理:

    $html="<div>
           afterfirst
            <div>nested</div>
           this is lost
           </div>
           <div>div2</div>" ;

    $div_array =  parse_array($html,"<div", "</div>") ;
    echo $div_array[0]. "</br>" ;
    //outputs:
    <div>
    afterfirst
    <div>nested</div>
    //the line "this is lost" and the last </div> isn't included. 

基本上该功能无法处理嵌套标签

可以更改功能,以便能够处理嵌套标签吗?也就是说,它不会停留在下一个结束标记,而是跟踪任何其他嵌套标记,并仅在正确的结束标记之后停止

任何帮助?

由于

编辑:我知道正则表达式不会被推荐用于解析,并且有php DOM和simplehtmldom,但是这个解析数组函数效果很好,如果它只能处理嵌套标签,那就完美了!所以对此的任何帮助将不胜感激。如果没有完整的解决方案,请给我一些提示。

2 个答案:

答案 0 :(得分:1)

  

编辑:我知道正则表达式不会被推荐   用于解析,并且有php DOM和   simplehtmldom,但这个解析数组   功能很好,如果只是它   可以处理嵌套标签   完美!所以对此有任何帮助   我将不胜感激。给我吗   如果没有完全解决方案,某种暗示   请。

正则表达式不会也无法计算和跟踪这样的事情。嵌套标签的这个问题正是为什么不建议使用正则表达式解析HTML的原因,因为它很快就变得不可能了。解析器可能更有效,但它更可靠。

您可以尝试一件事,即在正则表达式结束时删除U(ungreedy)标记。 “ungreedy”意味着它将匹配它出现的第一个</div>标签,而在默认的“贪婪”模式下它将匹配最后一个。根据您的HTML,这可能适用于您的具体情况,也可能不适用,但至少值得一试。虽然它没有解决尝试用正则表达式解析嵌套标签的问题,但如果这不起作用,你将不得不使用解析器。

答案 1 :(得分:0)

  有些人在面对的时候   问题,想想“我知道,我会用   正则表达式。“现在他们有   两个问题。

解决方案:

Simple DOM HTML Parser