php正则表达式获取href标签内的字符串
Posted
技术标签:
【中文标题】php正则表达式获取href标签内的字符串【英文标题】:php regex to get string inside href tag 【发布时间】:2011-04-29 09:59:41 【问题描述】:我需要一个正则表达式,它可以在 href 标记内和引号内提供字符串。
例如,我需要在以下内容中提取 theurltoget.com:
<a href="theurltoget.com">URL</a>
此外,我只想要基本 url 部分。 IE。来自http://www.mydomain.com/page.html
我只想要http://www.mydomain.com/
【问题讨论】:
一般共识:不要使用正则表达式解析 HTML。 好的,我怎样才能得到href标签然后使用php php.net/manual/en/class.domdocument.php 和 php.net/manual/en/function.parse-url.php 就是您所需要的。 您的数据甚至不包含方案。href
可能并不总是包含方案和域。
不要使用正则表达式解析 HTML。使用适当的 HTML 解析模块。 您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已经编写、测试和调试的 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php。
【参考方案1】:
不要为此使用正则表达式。你可以使用 xpath 和内置的 php 函数来获得你想要的:
$xml = simplexml_load_string($myHtml);
$list = $xml->xpath("//@href");
$preparedUrls = array();
foreach($list as $item)
$item = parse_url($item);
$preparedUrls[] = $item['scheme'] . '://' . $item['host'] . '/';
print_r($preparedUrls);
【讨论】:
能否提供一个主题相关的$myHtml示例字符串请c: 如何检查html无效。类似用户输入html<div>
为div>
这是从 HTML 文档中提取属性的最优雅的方法。【参考方案2】:
$html = '<a href="http://www.mydomain.com/page.html">URL</a>';
$url = preg_match('/<a href="(.+)">/', $html, $match);
$info = parse_url($match[1]);
echo $info['scheme'].'://'.$info['host']; // http://www.mydomain.com
【讨论】:
当标签中有更多属性时,这将不起作用。例如。 href="mydomain.com/page.html" class="blue" rel=even"。这将返回 [path] => /page.html" class="blue" rel=even" 另外:是的,如果您只寻找基本 url 部分(@David 问题的第二部分),这将起作用!如果您正在查找 href 之间的整个 url,请使用另一个正则表达式(我将尝试在下面的答案中发布此内容)。【参考方案3】:这个表达式将处理 3 个选项:
-
没有引号
双引号
单引号
'/href=["\']?([^"\'>]+)["\']?/'
【讨论】:
我有一个这种表达式有效的情况,除非双引号 url 包含单引号(就像 google maps url 的方式一样)。现在,您的正则表达式在第一个单引号处停止(即使 url 被双引号包围)【参考方案4】:如果您只是在寻找基本 url 部分(@David 问题的第二部分),请使用 @Alec 的答案!
$html = '<a href="http://www.mydomain.com/page.html" class="myclass" rel="myrel">URL</a>';
$url = preg_match('/<a href="(.+)">/', $html, $match);
$info = parse_url($match[1]);
这会给你:
$info
Array
(
[scheme] => http
[host] => www.mydomain.com
[path] => /page.html" class="myclass" rel="myrel
)
所以你可以使用$href = $info["scheme"] . "://" . $info["host"]
这给了你:
// http://www.mydomain.com
当您在 href 之间查找 整个 url 时,您应该使用另一个正则表达式,例如 @user2520237 提供的正则表达式。
$html = '<a href="http://www.mydomain.com/page.html" class="myclass" rel="myrel">URL</a>';
$url = preg_match('/href=["\']?([^"\'>]+)["\']?/', $html, $match);
$info = parse_url($match[1]);
这会给你:
$info
Array
(
[scheme] => http
[host] => www.mydomain.com
[path] => /page.html
)
现在您可以使用$href = $info["scheme"] . "://" . $info["host"] . $info["path"];
这给了你:
// http://www.mydomain.com/page.html
【讨论】:
【参考方案5】:http://www.the-art-of-web.com/php/parse-links/
让我们从最简单的情况开始——没有额外属性的格式良好的链接:
/<a href=\"([^\"]*)\">(.*)<\/a>/iU
【讨论】:
/U
修饰符解决了我的问题。感谢您的提示!
如果<a>
元素中有其他属性,这将不起作用。【参考方案6】:
对于所有 href 值替换:
function replaceHref($html, $replaceStr)
$match = array();
$url = preg_match_all('/<a [^>]*href="(.+)"/', $html, $match);
if(count($match))
for($j=0; $j<count($match); $j++)
$html = str_replace($match[1][$j], $replaceStr.urlencode($match[1][$j]), $html);
return $html;
$replaceStr = "http://affilate.domain.com?cam=1&url=";
$replaceHtml = replaceHref($html, $replaceStr);
echo $replaceHtml;
【讨论】:
【参考方案7】:这将处理 URL 周围没有引号的情况。
/<a [^>]*href="?([^">]+)"?>/
但说真的,do not parse HTML with regex。使用 DOM 或适当的解析库。
【讨论】:
我有点害怕DOM,我相信REGEX在很多情况下可以挽救你的生命...... URL 周围没有引号......这在语法上是否正确?【参考方案8】:/href="(https?://[^/]*)/
我认为你应该能够处理剩下的事情。
【讨论】:
【参考方案9】:因为正面和负面的 Lookbehind 很酷
/(?<=href=\").+(?=\")/
它只会匹配你想要的,不带引号
数组 ( [0] => theurltoget.com)
【讨论】:
以上是关于php正则表达式获取href标签内的字符串的主要内容,如果未能解决你的问题,请参考以下文章