这个问题在这里已有答案:
我想提取像href
一样只有某些类的锚的link-wrapper
。
所以,这意味着我将拥有链接的href,如:
<a href="blaa..blaa" class="link-wrapper">click here</a>
附:它应该提取两个链接,如果它们按顺序方式对齐,如:
<a href="blaa" class="link-wrapper">link-1</a><a href="blaa" class="link-wrapper">link-2</a>
我尝试了堆栈溢出中已经存在的解决方案,但没有一个适合我的问题。因为其中一些是java脚本和其他语言。我试图寻找DOMDocument,但它很难与解决方案完全匹配。
我绑了一些对我不起作用的preg_match,比如:
preg_match('/<a(?:(?!class\=")(?:.|\n))*class\="(?:(?!link\-wrapper)(?:.|\n))*link\-wrapper(?:(?!<\/a>)(?:.|\n))*<\/a>/i', $content, $output_array);
您可以使用DOMDocument
和DOMXPath
来获得结果。首先将HTML加载到DOMDocument
中,然后使用XPath查询来查找包含link-wrapper
类的所有锚点,例如
$html = '<a href="blaa..blaa" class="link-wrapper">click here</a><a href="not.blaa" class="something-else">link-3</a>
<a href="blaa" class="link-wrapper">link-1</a><a href="blaa..again" class="link-wrapper">link-2</a>';
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
foreach ($xpath->query('//a[contains(@class, "link-wrapper")]') as $a) {
$urls[] = $a->attributes->getNamedItem('href')->nodeValue;
}
foreach ($urls as $url) {
echo "$url\n";
}
输出:
blaa..blaa
blaa
blaa..again