【问题标题】:Unable to use regex to search in PHP?无法使用正则表达式在 PHP 中搜索?
【发布时间】:2010-09-06 12:10:46
【问题描述】:

我正在尝试获取特定标签中的 html 文档的代码。

我的方法适用于某些标签,但不是全部,它不适用于我想要获取的标签内容。

这是我的代码:

<html>
<head></head>
<body>
<?php 
     $url = "http://sf.backpage.com/MusicInstruction/";   
     $data = file_get_contents($url);
     $pattern = "/<div class=\"cat\">(.*)<\/div>/";
     preg_match_all($pattern, $data, $adsLinks, PREG_SET_ORDER);
     var_dump($adsLinks);
     foreach ($adsLinks as $i) {
         echo "<div class='ads'>".$i[0]."</div>";
     } 

?>
</body>
</html>

上面的代码不起作用,但是当我把$pattern改成:

$pattern = "/<div class=\"date\">(.*)<\/div>/";

$pattern = "/<div class=\"sponsorBoxPlusImages\">(.*)<\/div>/";

我看不出这些 $pattern 有什么不同。请帮我找出错误。 谢谢。

【问题讨论】:

    标签: php html regex parsing search


    【解决方案1】:

    使用PHP DOM 来解析 HTML 而不是正则表达式。

    例如在您的情况下 (代码已更新以显示 HTML)

    $doc = new DOMDocument();
    @$doc->loadHTML(file_get_contents("http://sf.backpage.com/MusicInstruction/"));
    $nodes = $doc->getElementsByTagName('div');
    
    for ($i = 0; $i < $nodes->length; $i ++)
    {
        $x = $nodes->item($i);
    
        if($x->getAttribute('class') == 'cat');
            echo htmlspecialchars($x->nodeValue) . "<hr/>"; //this is the element that you want
    }
    

    【讨论】:

    • 感谢您的建议,将尝试。
    【解决方案2】:

    您的正则表达式失败的原因是您期望 .匹配换行符,除非你使用s modifier,否则它不会匹配,所以试试

    $pattern = "/<div class=\"cat\">(.*)<\/div>/s";
    

    执行此操作时,您可能会发现该模式有点过于贪婪,因为它会尝试捕获直到最后一个关闭 div 元素的所有内容。为了使它不贪婪,并且只匹配下一个关闭的 div,添加一个 ?在*之后

    $pattern = "/<div class=\"cat\">(.*?)<\/div>/s";
    

    这只是为了说明除了最简单的情况外,使用正则表达式解析 HTML 是疯狂的道路。所以尝试使用DOM functions 来解析HTML。

    【讨论】:

    • 我是 PHP 新手,现在正在使用正则表达式。这个答案帮助我解决问题,所以我会选择它。虽然我会尝试 DOM 来完成未来的任务。谢谢大家。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2013-06-06
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多