我试图从以下字符串中获取href值:
<td valign="top" width="300"class="topborder"><a href="/path/to/somewhere" class="bigger">random1</a><br/>
<td valign="top" width="300"class="topborder"><a href="/path/to/somewhere2" class="bigger">random2</a><br/>
在这种情况下,我应该得到“/ path / to / somewhere”和“/ path / to / somewhere2”
我尝试执行以下操作,但我只是得到空字符串。
$htmlc = str_replace(' ', '', $htmlc);
//$htmlc contains the string I am parsing with the spaces removed
preg_match_all('/width=\"300\"class=\"topborder\"><ahref=\"([^\"class=\"bigger\"]+)/', $htmlc, $hrefvals);
$ hrefvals此时包含空字符串。我在preg_match_all中做错了什么?
答案 0 :(得分:4)
您需要的只是DOM和XPath。正则表达式不是为HTML解析而设计的。
<?php
$html = <<<HTML
<td valign="top" width="300"class="topborder"><a href="/path/to/somewhere" class="bigger">random1</a><br/>
<td valign="top" width="300"class="topborder"><a href="/path/to/somewhere2" class="bigger">random2</a><br/>
HTML;
$dom = new DOMDocument;
$dom->loadHTML($html);
// replace with @$dom->loadHTMLFile('http://...') with you want to parse an URL
$xpath = new DOMXPath($dom);
$links = array_map(function ($node) {
return $node->getAttribute('href');
}, iterator_to_array($xpath->query("//td[@class='topborder']/a[@class='bigger']")));
var_dump($links);
这给了我以下内容:
array(2) {
[0]=>
string(18) "/path/to/somewhere"
[1]=>
string(19) "/path/to/somewhere2"
}
答案 1 :(得分:1)
尝试这样的模式
/width=\"300\"class=\"topborder\"><ahref=\"(.*?)"/
"(.*?)"
将匹配任何字符,但是“懒惰”。这意味着一旦它找到组后的第一个"
(在这种情况下:href
标记的结尾),该组将结束
答案 2 :(得分:0)
或者您可以尝试:
$htmlc = '
<td valign="top" width="300"class="topborder"><a href="/path/to/somewhere" class="bigger">random1</a><br/>
<td valign="top" width="300"class="topborder"><a href="/path/to/somewhere2" class="bigger">random2</a><br/>
';
preg_match_all('~(?<=<a\shref=")[^"]*~', $htmlc, $hrefvals);
var_dump($hrefvals);
答案 3 :(得分:-3)
<script>
$(document).ready(function(){
$("button").click(function(){
alert($("#blah").attr("href"));
});
});
</script>
则...
<a href="http://www.blah.com" id="blah">Blah</a></p>
<button>Show href Value</button>
这是你的意思吗?