【问题标题】:php regex to get string inside href tagphp正则表达式获取href标签内的字符串
【发布时间】: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
  • 您的数据甚至不包含方案。 href 可能并不总是包含方案和域。
  • 不要使用正则表达式解析 HTML。使用适当的 HTML 解析模块。 您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已经编写、测试和调试的 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php

标签: php regex html-parsing


【解决方案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 个选项:

  1. 没有引号
  2. 双引号
  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)

        【讨论】:

          猜你喜欢
          • 2017-05-15
          • 1970-01-01
          • 1970-01-01
          • 2013-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-11
          • 2018-05-14
          相关资源
          最近更新 更多