【问题标题】:Replace links from specific domain with text (PHP)用文本替换来自特定域的链接(PHP)
【发布时间】:2010-04-24 20:52:37
【问题描述】:

我有:

<a href="http://abc.com">Title</a>

还有:

<a href="http://xyz.com">Title</a>

我想替换文本“标题”的链接,但只能来自http://abc.com。但我不知道怎么做(我试过谷歌),你能为我解释一下。我不擅长 PHP。

提前致谢。

【问题讨论】:

    标签: php text replace hyperlink


    【解决方案1】:

    不确定我是否真的理解您的要求,但如果您:

    • 有一个包含一些 HTML 的字符串
    • 并且想用一些文本替换所有指向 abc.com 的链接

    然后,一个好的解决方案(比正则表达式更好,我应该说!) 是使用与 DOM 相关的类——尤其是,你可以看看 DOMDocument 类,以及它的loadHTML 方法。


    例如,考虑到 HTML 部分是在变量中声明的:

    $html = <<<HTML
    <p>some text</p>
    <a href="http://abc.com">Title</a>
    <p>some more text</p>
    <a href="http://xyz.com">Title</a>
    <p>and some again</p>
    HTML;
    


    然后你可以使用这样的东西:

    $dom = new DOMDocument();
    $dom->loadHTML($html);
    $tags = $dom->getElementsByTagName('a');
    for ($i = $tags->length - 1 ; $i > -1 ; $i--) {
        $tag = $tags->item($i);
        if ($tag->getAttribute('href') == 'http://abc.com') {
            $replacement = $dom->createTextNode($tag->nodeValue);
            $tag->parentNode->replaceChild($replacement, $tag);
        }
    }
    echo $dom->saveHTML();
    


    这将为您提供 HTML 的以下部分,作为输出:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
    <html><body>
    <p>some text</p>
    Title
    <p>some more text</p>
    <a href="http://xyz.com">Title</a>
    <p>and some again</p>
    </body></html>
    


    请注意,整个 &lt;a href="http://abc.com"&gt;Title&lt;/a&gt; 部分已被其包含的文本替换。

    如果您想要一些其他文本,只需在我使用 $tag-&gt;nodeValue 的地方使用它,这是要删除的节点的当前内容。

    不幸的是,是的,这会生成一个完整的 HTML 文档,包括 doctype 声明、&lt;html&gt;&lt;body&gt; 标签,...

    【讨论】:

    • 谢谢你,它有效。但是当我使用 Magpie RSS 通过 RSS 提要解析内容时,我想要替换的链接通常是动态的。我的意思是,在 RSS 的 标记中有链接,如 abc.com/tag/tag1abc.com/tag/tag2.... 我可以用文本替换所有这些链接吗?
    【解决方案2】:

    涵盖另一个解释的案例:

    $string = '<a href="http://abc.com">Title</a> <a href="http://xyz.com">Title</a>';
    $pattern = '/\<\s?a\shref[\s="\']+([^\'"]+)["\']\>([^\<]+)[^\>]+\>/';
    $result = preg_replace_callback($pattern, 'replaceLinkValueSelectively', $string);
    
    function replaceLinkValueSelectively($matches)
    {
        list($link, $URL, $value) = $matches;
    
        switch ($URL)
        {
            case 'http://abc.com':
                $newValue = 'New Title';
                break;
    
            default:
                return $link;
        }
    
        return str_replace($value, $newValue, $link);        
    }
    
    echo $result;
    

    输入

    <a href="http://abc.com">Title</a> <a href="http://xyz.com">Title</a>
    

    变成

    <a href="http://abc.com">New Title</a> <a href="http://xyz.com">Title</a>
    

    $string 是您的输入,$result 是您修改的输入。您可以将更多 URL 定义为案例。 请注意:我匆忙写了那个正则表达式,我是新手。请检查它是否适合您的所有预期情况。

    【讨论】:

      猜你喜欢
      • 2016-12-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2018-03-22
      • 2012-01-19
      相关资源
      最近更新 更多