【问题标题】:Change the href attribute of <a> tags in an html document更改 html 文档中 <a> 标记的 href 属性
【发布时间】:2010-11-18 02:54:49
【问题描述】:

我正在使用 file_get_contents 来获取某个文件的内容 -- 到目前为止,这是可行的。

现在我想搜索文件并将所有&lt;a href=" 替换为&lt;a href="site.php?url=,然后再显示文件。

我该怎么做?我知道我应该使用某种str_replace 甚至preg_replace。但我不知道如何实际搜索并为我使用file_get_contents 获取的文件执行此操作。

【问题讨论】:

    标签: php html dom replace hyperlink


    【解决方案1】:

    为了稳定性/可靠性,建议使用 DOM 解析器而不是正则表达式或基本字符串替换函数,因为它们是 DOM 无知的。

    它不会是最高效的解决方案,但它干净、易读、易于维护并且最不可能失败。您的最终用户可能不会注意到性能损失。

    后面的 sn-p 是对this answer 的改编。

    没有调用preg_str_replace() 函数。我使用 Xpath 过滤掉任何不需要的 href 匹配项。调用 http_build_query() 是一种生成编码 url 查询字符串的简洁方法。

    代码:(Demo)

    $html = <<<HTML
    <div>
        <img src="icons/example.svg">
        <a href="http://www.example.com">a link</a>
        <link href="css/example.css">
        <iframe src="http://www.example.com/default.htm"></iframe>
    </div>
    HTML;
    
    $dom = new DOMDocument();
    $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
    $xpath = new DOMXPath($dom);
    foreach ($xpath->query('//a/@href') as $attr) {
        $attr->value = "site.php?" . http_build_query(['url' => $attr->value]);
    }
    echo $dom->saveHTML();
    

    输出:

    <div>
        <img src="icons/example.svg">
        <a href="site.php?url=http%3A%2F%2Fwww.example.com">a link</a>
        <link href="css/example.css">
        <iframe src="http://www.example.com/default.htm"></iframe>
    </div>
    

    【讨论】:

      【解决方案2】:

      类似于 bisko 发送的代码,但是,无论是关于 enclose ', " 还是在 href 中什么都没有

      $text = '<a href="http://www.europanet.com.br">Europanet</a>     <a target="_blank" href=\'http://www.webjump.com.br\'>Webjump</a>
      <a id="link" href=http://www.euforia.com.br target="_top">Euforia</a>';
      $text = preg_replace('|(<a\s*[^>]*href=[\'"]?)|','\1site.php?url=', $text);
      

      【讨论】:

      • 是的,太棒了!但是如何对 img-tags 做同样的事情呢?是否只是更改preg_replace中的a和href。以及如何将所有这些合二为一?使用 img-tags 和 href-tags!谢谢你的回答。
      【解决方案3】:
      $new_content = preg_replace('!(<a\s*[^>]*)href="([^"]+)"!','\1 href="site.php?url=\2"', $content);
      

      我认为这应该可以解决问题:

      • 它取代了链接的href,无论它位于何处
      • 例如适用于

      【讨论】:

      • HTML 属性值可能包含纯 &gt; 字符。
      • 我已经用正则表达式解析了很多网站,从来没有偶然发现属性值中的 。如果您还记得的话,能给我举个例子吗?
      • 不,\1 和 \2 不应以任何方式进行 url 编码。在 RegExp 引擎的上下文中,它们表示 Match #1 和 Match #2。上面的例子大致翻译成匹配一个字符串,如 '(
      【解决方案4】:

      file_get_contents 返回一个包含文件内容的字符串。

      因此,您可以使用任何您想要的字符串操作函数来处理这个字符串,就像您谈到的那样。

      这样的事情,使用 str_replace,可能会做:

      $content = file_get_contents('http://www.google.com');
      
      $new_content = str_replace('<a href="', '<a href="site.php?url=', $content);
      
      echo $new_content;
      

      但请注意,当href 属性是&lt;a 标记的第一个属性时,它只会替换该属性中的URL...

      使用正则表达式可能对您有更多帮助;但恐怕也不会完美……

      如果您正在处理 HTML 文档并想要一个“完整”的解决方案,那么使用 DOMDocument::loadHTML 并使用 DOM 操作方法可能是另一种(稍微复杂一点,但可能更强大)的解决方案。


      这两个问题的答案也可能对您有所帮助,具体取决于您愿意做什么:


      编辑看到评论后:

      如果要替换两个字符串,可以将数组传递给str_replace的前两个参数。例如:

      $new_content = str_replace(
          array('<a href="', 'Pages'), 
          array('<a href="site.php?url=', 'TEST'), 
          $content);
      

      这样:

      • &lt;a href="”将被“&lt;a href="site.php?url=”替换
      • 和 'Pages' 将被替换为 'TEST'

      并且,引用手册:

      如果搜索和替换是数组, 然后 str_replace() 从 每个数组并使用它们进行搜索 并替换主题。如果更换 的值比 search 少,那么 空字符串用于其余的 替换值。如果搜索是 数组和替换是一个字符串,那么 此替换字符串用于 search 的每一个值。

      如果你想替换 '&lt;a href="' 的所有实例,那么 str_replace 默认会这样做 :-)

      【讨论】:

      • 我还有一个问题。尽管这是一个很好的答案,但对我有所帮助。如果我想做 2 次替换,那将如何工作?一次更换 2 个。
      • 我用更多信息编辑我的答案,这可能会帮助你:-)玩得开心!
      【解决方案5】:

      如果您想在您的网站上使用远程文档但保持该文档的链接完整,最好使用BASE element 来声明基本 URI:

      <base href="http://example.com/path/to/remote/document">
      

      【讨论】:

        【解决方案6】:
        $text = file_get_contents('some_file');
        $text = str_replace('<a href="', '<a href="site.php?url=', $text);
        

        【讨论】:

        猜你喜欢
        • 2013-11-24
        • 2013-11-22
        • 2010-10-14
        • 2021-01-03
        • 2017-09-20
        • 2014-12-24
        • 1970-01-01
        • 2014-10-21
        • 2012-06-08
        相关资源
        最近更新 更多