获取 A 元素的 href 属性

试图找到页面上的链接。

我的正则表达式是:

/<a\s[^>]*href=(\"\'??)([^\"\' >]*?)[^>]*>(.*)<\/a>/

但似乎失败了

<a title="this" href="that">what?</a>

如何更改正则表达式以处理没有首先放在 a 标记中的 href?

101675 次浏览

你为什么不配对呢

"<a.*?href\s*=\s*['"](.*?)['"]"


<?php


$str = '<a title="this" href="that">what?</a>';


$res = array();


preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res);


var_dump($res);


?>

那么

$ php test.php
array(2) {
[0]=>
array(1) {
[0]=>
string(27) "<a title="this" href="that""
}
[1]=>
array(1) {
[0]=>
string(4) "that"
}
}

我刚刚取下了第一个捕捉支架。

你想要寻找的模式应该是链接锚模式,比如(某些东西) :

$regex_pattern = "/<a href=\"(.*)\">(.*)<\/a>/";

快速测试: <a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a>似乎起到了作用,第一个匹配是“或”,第二个是“ href”值“ that”,第三个是“ what?”.

我将第一个匹配项“/’”保留在这里的原因是,您可以使用它来反向引用它,以便在以后的结束时使用“/”,因此它是相同的。

See live example on: http://www.rubular.com/r/jsKyK2b6do

我不确定您在这里要做什么,但是如果您想验证链接,那么可以查看 PHP 的 filter _ var ()

如果你真的需要使用正则表达式,那么看看这个工具,它可能会有所帮助: Http://regex.larsolavtorvik.com/

使用您的正则表达式,我对它进行了一些修改,以满足您的需要。

<a.*?href=("|')(.*?)("|').*?>(.*)<\/a>

我个人建议你使用 HTML 解析器

编辑: 测试

用于 HTML 的可靠的正则表达式是困难的 :

$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
echo $dom->saveHtml($node), PHP_EOL;
}

以上代码将查找并输出 $html字符串中所有 A元素的 「外部 HTML 」

为了获得节点的所有文本值,需要

echo $node->nodeValue;

如果 href属性存在,则可以将

echo $node->hasAttribute( 'href' );

走开执行 href属性

echo $node->getAttribute( 'href' );

改变执行 href属性

$node->setAttribute('href', 'something else');

拿开执行 href属性

$node->removeAttribute('href');

您还可以直接使用 XPath查询 href属性

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//a/@href');
foreach($nodes as $href) {
echo $href->nodeValue;                       // echo current attribute value
$href->nodeValue = 'new value';              // set new attribute value
$href->parentNode->removeAttribute('href');  // remove attribute
}

参见:

旁注: 我敢肯定这是一个副本,你可以 在这里找到答案

我同意 Gordon 的观点,您必须使用 HTML 解析器来解析 HTML。但是如果你真的想要一个正则表达式,你可以试试这个:

/^<a.*?href=(["\'])(.*?)\1.*$/

这与字符串开始处的 <a匹配,后面是任意数量的任意字符(非贪婪) .*?,然后是 href=,后面是被 "'包围的链接

$str = '<a title="this" href="that">what?</a>';
preg_match('/^<a.*?href=(["\'])(.*?)\1.*$/', $str, $m);
var_dump($m);

Output:

array(3) {
[0]=>
string(37) "<a title="this" href="that">what?</a>"
[1]=>
string(1) """
[2]=>
string(4) "that"
}

PREG _ match _ all (“/(] >)(.?)(

它经过测试,并从任何 html 代码中获取所有标记。

对于那些仍然没有使用 SimpleXML 非常容易和快速地获得解决方案的人来说

$a = new SimpleXMLElement('<a href="www.something.com">Click here</a>');
echo $a['href']; // will echo www.something.com

对我有用

下面的代码对我很有用,它返回锚标记的 hrefvalue

preg_match_all("'\<a.*?href=\"(.*?)\".*?\>(.*?)\<\/a\>'si", $html, $match);
if($match) {
foreach($match[0] as $k => $e) {
$urls[] = array(
'anchor'    =>  $e,
'href'      =>  $match[1][$k],
'value'     =>  $match[2][$k]
);
}
}

称为 $urls的多维数组现在包含易于使用的关联子数组。