代码之家  ›  专栏  ›  技术社区  ›  Craig Gardner

检索标签之间的文本

  •  0
  • Craig Gardner  · 技术社区  · 16 年前

    我正在尝试从HTML文件中检索链接文本。每个链接都有一个应用于它们的特定类,但URL是不同的。

    ...
    <a class="fetch-me" href="products/1">Find ME!!!</a>
    ...
    <a class="fetch-me" href="products/2">Me too!</a>
    ...
    

    我正在使用以下PHP代码,但总是得到比我想要的更多:

    preg_match_all('<a class="fetch-me" href=".*">(.*)</a>)siU', $string, $matching_data);
    
    5 回复  |  直到 16 年前
        1
  •  3
  •   meder omuraliev    16 年前
    <?php
    
    $str = '
    <a class="fetch-me" href="products/1">Find ME!!!</a>
    ...
    <a class="fetch-me" href="products/2">Me too!</a>
    ';
    
    $doc = new DOMDocument();
    $doc->loadHTML($str);
    $xp = new DOMXpath($doc);
    $query = $xp->evaluate('//a[@class="fetch-me"]');
    
    if ( $query->length > 0 ) {
        foreach ($query as $anchor ) {
        echo $anchor->nodeValue . '<br>';
        }
    }
    

    @contains 结合 @class 如果多个类值很重要,您也可以始终为DOM使用抽象的高级包装器。

        2
  •  0
  •   Mark Elliot    16 年前

    比如说:

    /<a[^>]*([^<]*)<\/a>/siU
    
        3
  •  0
  •   ghostdog74    16 年前

    单程

    $str= <<<A
    blah blah
    blah
    ...
    <a class="fetch-me" href="products/1">Find ME!!!</a>
    <a class="fetch-me" href="products/2">Me too!</a>
    blah
    blah
    <a class="fetch-me"
              href="products/1">Find me, i am at next line!!!</a> blah blah
    A;
    $s = explode("</a>",$str);
    foreach ($s as $k ){
        if (strpos($k,"href" ) !==FALSE ){
            print "--> ". preg_replace("/^.*href=\".*\">|\">.*/sm","",$k)."\n";
        }
    }
    

    输出

    $ php test.php
    --> Find ME!!!
    --> Me too!
    --> Find me, i am at next line!!!
    

    理想情况下,您应该像其他人所说的那样使用实际的解析器。

        4
  •  0
  •   Craig Gardner    16 年前

    我尝试了所有这些答案,每个人都可能是对的。我将进行重构,以使用HTML Tidy和真正的解析器。

        5
  •  0
  •   Community Mohan Dere    9 年前

    如果必须使用正则表达式,请使用 .*? 而不是 .* *? 是 non-greedy * ; 也就是说,与其尽可能多地匹配,不如尽可能少地匹配。

    (顺便说一下, don't try matching HTML or XML with regular expressions madness . 相反,尝试使用 HTML 或 XML 解析器。如果没有HTML解析器,请运行它 HTML Tidy meder's answer 了解如何在PHP中执行此操作。)。

    推荐文章