【问题标题】:Replace Specifc Full Links Between href=" " Using PHP使用 PHP 替换 href=" " 之间的特定完整链接
【发布时间】:2012-01-19 09:20:56
【问题描述】:

我已尝试搜索相关答案,但找不到适合我特定需求的内容。我在我的一个 wordpress 网站上的 1,000 篇文章中有相当多的附属链接 - 它们都以相同的 url 格式和子域结构开头:

http://affiliateprogram.affiliates.com/

但是,在初始 url 格式之后,查询字符串会为每个单独的 url 附加更改,以便将访问者引导到目标站点上的特定页面。

我正在寻找可以扫描包含上述特定域的所有 href 链接的 html 代码字符串(文章正文),然后用我的另一个标准链接替换整个链接(无论附加的查询字符串)的东西选择。

href="http://affiliateprogram.affiliates.com/?random=query_string&page=destination"

被替换为

href="http://www.mylink.com"

理想情况下,我希望通过 php 来完成此操作,因为我已经掌握了基本知识,但如果您有任何其他建议,我将不胜感激。

提前致谢。

【问题讨论】:

    标签: php regex string preg-replace html-parsing


    【解决方案1】:
    $a = '<a class="***" href="http://affiliateprogram.affiliates.com/?random=query_string&page=destination" attr="***">';
    
    $b = preg_replace("/<a([^>]*)href=\"http:\/\/affiliateprogram\.affiliates\.com\/[^\"]*\"([^>]*)>/", "<a\\1href=\"http://www.mylink.com/\"\\2>", $a);
    
    var_dump($b); // <a class="***" href="http://www.mylink.com/" attr="***">
    

    【讨论】:

    • 虽然寻找完整的标签可能是更好的方法,但&lt;a(.*?)href 太简单了。任何&lt;a name= 标签都会失败,然后跨越多个标签。它可能仍然有效,但不是您想要的更精确的模式。
    • @mario 我用正则表达式做了很多工作。是的,你正确的。你必须知道if you apply regular expression to solve one problem you will have 2 problems :) 在任何情况下这个sopution 将在Ben 提出的范围内工作。
    • 是的,但更简单的也会如此。寻找锚点但忽略填充物并不是结构和弹性的好处。
    • @mario 你是什么意思?这将适用于任何 我不仅使用 (.*?) ,而且在正确使用时它是一个非常有用的模式。在这种情况下,将捕获 &lt;ahref= 之间的所有合法 HTML。
    • 给定输入&lt;a name=xy&gt;&lt;a href=...&gt;,您的正则表达式将同时匹配两个标签。因此,让你对不完整模式的争吵有点多余。
    【解决方案2】:

    使用正则表达式,例如:

    href="(https?:\/\/affiliateprogram.affiliates.com\/[^"]*)"
    

    $data =<<<EOT
      <a href="http://affiliateprogram.affiliates.com/?random=query_string&page=destination">bar</a>
      <a href="http://stackoverflow.com/questions/8490284/replace-specifc-full-links-between-href-using-php">foo</a>
      <a name="zz" href="http://affiliateprogram.affiliates.com/?query=random&page=destination&string">baz</a>
    EOT;
    
    echo (
      preg_replace (
        '#href="(https?://affiliateprogram.affiliates.com/[^"]*)"#i',
        'href="http://www.mylink.com"',
        $data
      )
    );
    

    输出

    <a href="http://www.mylink.com">bar</a>
    <a href="http://stackoverflow.com/questions/8490284/replace-specifc-full-links-between-href-using-php">foo</a>
    <a name="zz" href="http://www.mylink.com">baz</a>
    

    【讨论】:

      【解决方案3】:

      这很简单,因为查询字符串只需要一个占位符。 .*? 通常会这样做,但您可以通过匹配不是双引号的任何内容来使其更具体:

      $html =
      preg_replace('~ href="http://affiliateprogram\.affiliates\.com/[^"]*"~i',
                    ' href="http://www.mylink.com"', $html);
      

      人们可能会转而推荐一种冗长的 方法,但对于这样的任务来说,这可能是矫枉过正。

      【讨论】:

      • +1 表示 DOMDocument 冗长,实际上只是文本替换。
      • 不暗示它完全没用。但这个任务肯定是众所周知的输出转换,而不是任意的网络垃圾 HT​​ML 输入。所以只是寻找所需的目标可能没问题。
      • 这不是一个完整的解决方案。您必须考虑完整的锚
      • 感谢您的帮助。我评论的这两个建议都非常有效,并且使用我的基本 php 知识很容易实现。
      • @webarto 不是我的朋友。你应该考虑一个有效的解决方案。只需使用 href 即可轻松完成工作。
      【解决方案4】:
      <?php
      
      $html = 'href="http://affiliateprogram.affiliates.com/?random=query_string&page=destination"';
      
      echo preg_replace('#http://affiliateprogram.affiliates.com/([^"]+)#is', 'http://www.mylink.com', $html);
      
      ?>
      

      http://ideone.com/qaEEM

      【讨论】:

      • 哇。感谢您如此迅速的反应。这完美地工作,您将节省我无数小时手动/或尝试自己解决它。非常感谢
      • 这不是一个完整的解决方案。您必须考虑完整的锚
      • @webarto 正如我所说,您的解决方案没有考虑完整的锚点:因此将替换文本中的每个 href="***",甚至不是真正的锚点!
      • @NomikOS,没关系,重点是替换某些链接,而不仅仅是锚点(尽管它们都可能是 a->href)。对于更复杂的情况,您应该使用 DOMDocument 而不是使用正则表达式中的十几个 (.*?) ... 这只是一个简单的替换。
      • @webarto 很明显他想要在真正的锚上工作(这是替换文章正文的正常操作)。但请不要作恶 (.*?) 这是一个正确的模式,它适用于目前的范围。好的,很有趣, 直到下一个,和平! o/\o
      猜你喜欢
      • 2015-09-16
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2021-05-30
      • 2018-03-22
      • 2016-07-04
      相关资源
      最近更新 更多