我正在尝试从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);
答案 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。相反,请尝试使用madness或HTML解析器。如果您没有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和一个真正的解析器。
感谢您的建议。