代码之家  ›  专栏  ›  技术社区  ›  Ankur Mukherjee

请指定正确的正则表达式

  •  0
  • Ankur Mukherjee  · 技术社区  · 15 年前

    我希望检索 <table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#EBEBEB"> </table> 任何人能给我指定一个正确的正则表达式来检索给定表标记之间的数据吗

    3 回复  |  直到 15 年前
        1
  •  1
  •   esqew    15 年前

    这取决于你要找回什么。我自己也不是PHP专业人士,但我会这样做:

    <?php
        $contents = file_get_contents($_SERVER['PHP_SELF']);
        $array = explode("<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#EBEBEB\">", $contents);
        $newarray = explode("</table>", $array[1]);
        $yourdata = $newarray[0];
    ?>
    

    如果您不介意将其余的原始HTML放在那里,那么应该使用这个方法。否则,其他人可能会有更好的解决方案。

        2
  •  2
  •   Hamid Nazari diptia    15 年前

    XPath 而不是正则表达式。

        3
  •  1
  •   Andrew Moore    15 年前

    虽然正则表达式可以很好地处理各种各样的任务,但我发现它在解析htmldom时通常是不够的。HTML的问题是,文档的结构非常多变,很难准确地(准确地说,我的意思是100%的成功率没有假阳性)提取标记。

    我建议您使用DOM解析器,例如 phpQuery 并按如下方式使用:

    function get_first_image($html){
        $dom = phpQuery::newDocument($html);
    
        $first_img = $dom->find('img:first');
    
        if($first_img !== null) {
            return $first_img->attr('src');
        }
    
        return null;
    }
    

    有些人可能认为这是一种过分的做法,但最终,它将更易于维护,并允许更多的可扩展性。例如,使用DOM解析器,我还可以获得alt属性。

    可以设计一个正则表达式来实现相同的目标,但是它的限制方式会使 alt 属性位于 src 或者相反,要克服这个限制,正则表达式将增加更多的复杂性。

    另外,请考虑以下几点。正确匹配 <img> src公司

    <\s*?img\s+[^>]*?\s*src\s*=\s*(["'])((\\?+.)*?)\1[^>]*?>
    

    同样,如果出现以下情况,上述操作可能会失败:

    • i
    • 引号不用于 src公司
    • 那么另一个属性呢 src公司 使用 >

    同样,不要使用正则表达式来解析dom文档。

    推荐文章