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 &lt;div&gt;div&gt; 这是从 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 修饰符解决了我的问题。感谢您的提示! 如果&lt;a&gt;元素中有其他属性,这将不起作用。【参考方案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标签内的字符串的主要内容,如果未能解决你的问题,请参考以下文章

java 正则表达式取出标签内的内容

正则表达式查找字符串中大括号内的任何标签

C#当中如何使用正则表达式获取某一标签的所有属性 属性数量不确定

JS如何用正则表达式 获取字符串内的匹配部份?

js 正则表达式获取小括号内的内容,不含括号

php获取html标签image的src内容 正则表达式