是否有任何正则表达式可以帮助我仅在特定班级选择锚点?

时间:2019-03-26 05:45:40

标签: php regex web-crawler domdocument

我想提取仅具有特定类别的锚点href,例如link-wrapper

所以,这意味着我将拥有链接的href,例如:

<a href="blaa..blaa" class="link-wrapper">click here</a>

P.S。如果它们按顺序对齐,则应该提取两个链接:

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

1 个答案:

答案 0 :(得分:1)

您可以使用DOMDocumentDOMXPath来获得结果。首先将HTML加载到ResultSet中,然后使用XPath查询查找所有包含DOMDocument类的锚点,例如

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";
}

Demo on 3v4l.org