检索A标签之间的文本

时间:2010-01-09 04:19:40

标签: php regex

我正在尝试从HTML文件中检索链接文本。每个链接都有一个特定的类,但网址不同。

我有以下内容:

...
<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 个答案:

答案 0 :(得分:3)

<?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的抽象高级包装器。

答案 1 :(得分:0)

如下:

/<a[^>]*([^<]*)<\/a>/siU

答案 2 :(得分:0)

如果您必须使用正则表达式,请使用.*?代替.**?*的{​​{3}}版本;也就是说,它不是尽可能匹配,而是尽可能少地匹配。

(顺便说一下,non-greedy;这种方式就是don't try matching HTML or XML with regular expressions。相反,请尝试使用madnessHTML解析器。如果您没有HTML解析器,通过XML运行它并使用XML解析器。有关如何在PHP中执行此操作,请参阅HTML Tidy。)。

答案 3 :(得分:0)

单程

$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)

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

感谢您的建议。