从<a>标签中提取PHP链接

17

可能是重复问题:
PHP字符串操作:提取hrefs

我正在使用php,并且有一个包含以下内容的字符串:

<a href="www.something.com">点击这里</a>

我需要除了"www.something.com"以外的所有内容都去掉,我认为可以用正则表达式来完成。 感谢任何帮助!


1
似乎每个人都想做这件事。 - dqhendricks
5个回答

57

使用SimpleXML非常容易实现:

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

1
一行代码解决方案 $url = (string)( new SimpleXMLElement('<a href="www.something.com">点击这里</a>'))['href']; - SkyRar

28

试试这个:

$link = '<a href="www.something.com">Click here</a>';
preg_match_all('/<a[^>]+href=([\'"])(?<href>.+?)\1[^>]*>/i', $link, $result);

if (!empty($result)) {
    # Found a link.
    echo $result['href'][0];
}

结果: www.something.com

更新: 现在需要引用样式匹配,以解决下面的评论。


1
这个可以匹配这个:href="_url_',但是这是错误的。 - dynamic
如果您允许',那么甚至可以没有引号:href=url。现在事情变得更加困难了。 - dynamic
随着精度的提高,复杂性也会增加。我将让原帖发布者决定我所提出的方案是否足够适用于他的应用程序。如果你要深入研究,请先阅读这篇文章:https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454 - Tails
那个链接是我想带你去的地方 ^_^ - dynamic

3
我建议使用以下代码来解决这个问题:
$str = '<a href="www.something.com">Click here</a>';
preg_match('/href=(["\'])([^\1]*)\1/i', $str, $m);
echo $m[2] . "\n";

输出

www.something.com

这将处理href链接中的单引号'和双引号"

不是因为你只写了 ([^"]*),就代表完全没有问题。 - dynamic
@yes123:请现在检查一下,我本来想使用反向引用\1,但是匆忙中打成了" - anubhava
现在好多了。考虑到你需要第一个括号,你可以简化为 (“|\’) - dynamic

1

假设变量的格式始终是ALWAYS,下面的代码应该可以解决问题。如果内容可能不是链接,则此方法无效。本质上,它会查找两个引号之间包含的数据。

<?php

$string = '<a href="www.something.com">Click here</a>';

$pattern = '/"[a-zA-Z0-9.\/\-\?\&]*"/';

preg_match($pattern, $string, $matches);
print_r($matches);
?>

是的,正如你所看到的,我的正则表达式有些生疏了 ;) - John Poulin

-1

也许你的问题并不是那么简单,但这正好符合你的要求:

$link = '<a href="www.something.com">Click here</a>';
$href = substr($link, 9, -16);

$href 是:

string(17) "www.something.com"

作为一个正则表达式,它可以表示为以下内容:
$href = preg_match('(^<a href="([^"]*)">Click here</a>$)', $link, $matches) ? $matches[1] : die('Invalid input data.');

这有帮助吗?


5
你是在问我是否需要很多负分吗?注意,我没有给你负分。你可以从我的个人资料/声望中查看。 - dynamic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接