【问题标题】:Remove anchors from text从文本中删除锚点
【发布时间】:2011-05-03 13:28:57
【问题描述】:

我需要从某些文本中删除锚标记,但似乎无法使用正则表达式来做到这一点。
只是锚标签,而不是它们的内容。
例如,<a href="http://www.google.com/" target="_blank">google</a> 将变为 google

【问题讨论】:

    标签: php regex


    【解决方案1】:

    没错,使用正则表达式无法正确完成。

    这是一个使用 DOM 的示例:

    $xml = new DOMDocument(); 
    $xml->loadHTML($html); 
    
    $links = $xml->getElementsByTagName('a');
    
    //Loop through each <a> tags and replace them by their text content    
    for ($i = $links->length - 1; $i >= 0; $i--) {
        $linkNode = $links->item($i);
        $lnkText = $linkNode->textContent;
        $newTxtNode = $xml->createTextNode($lnkText);
        $linkNode->parentNode->replaceChild($newTxtNode, $linkNode);
    }
    

    每当对 DOM 进行更改时,向后循环很重要。

    【讨论】:

    • 不错的答案,但我如何使用它?..不太清楚用法。我只是回显 $newTxtNode 吗?还是 lnkText???
    • @VyrenMedia Op 询问如何用文本内容替换链接,因此在此循环结束时,您有一个没有链接的 DOMDocument 对象。您可以使用$xml-&gt;saveHTML(); 来获取整个 html 结果。 $lnkText 包含当前链接文本作为字符串,你可能想trim它。
    • 非常感谢@Yann-Milin 的回复,不过我找到了解决此问题的正则表达式解决方案。
    • 正则表达式见下文,语句“无法使用正则表达式正确完成。”似乎不是真的。
    • 我想说的是,任何正则表达式解决方案都不是一个好的解决方案。您显然可以对 html 文本运行正则表达式查询,但这并不意味着您应该 :) 有趣的阅读主题:herehere
    【解决方案2】:

    那你可以试试

    preg_replace('/<\/?a[^>]*>/','',$Source);
    

    我在网上试过here on rubular

    【讨论】:

    • 这是不正确的,因为它还会删除以类似文章或地址开头的其他标签。
    • 也许是一个更好的正则表达式:preg_replace('/a(?:\s*|\s+[^>])>/ ', '', $vars['panes']);
    • @CSᵠ 答案更适合删除“a”标签的中间文本
    【解决方案3】:

    这个问题已经回答了,但我想我会添加我的解决方案。我比公认的解决方案更喜欢这个,因为它更切中要害。

    $content = 
        preg_replace(array('"<a href(.*?)>"', '"</a>"'), array('',''), $content);
    

    【讨论】:

    • 这个很好很简单,如果“href”不是锚标签中的第一个属性,也可以使用$content = preg_replace(array('"&lt;a (.*?)&gt;"', '"&lt;/a&gt;"'), array('',''), $content);
    • @DavidThomas 很棒的补充!
    【解决方案4】:

    使用正则表达式:

    preg_replace('/&lt;a[^&gt;]+&gt;([^&lt;]+)&lt;\/a&gt;/i','\1',$html);

    【讨论】:

    • 如果锚元素内部有&lt;img...&gt;元素怎么办?
    【解决方案5】:

    您正在寻找strip_tags()

    <?php
    
    // outputs 'google'
    echo strip_tags('<a href="http://www.google.com/" target="_blank">google</a>');
    

    【讨论】:

    • 我需要维护其他标签,我只需要移除锚点。
    • @Lior 啊,我明白了。 strip_tags 确实没有这样做。用户贡献的笔记中有一个实现可以帮助你:php.net/manual/en/function.strip-tags.php#100054
    • @Pekka 您可以将第二个参数传递给strip_tags(),它是一个“allowable_tags”字符串:php.net/manual/en/function.strip-tags.php
    • @Jasper 但这在这里没有帮助,不是吗?他必须指定$allowable_tags 中存在的所有标签
    • @Pekka 不幸的是,您必须将要删除的标签列入黑名单而不是能够将要删除的标签列入白名单,但是使用正在解析的该类型内容的一些知识,您可能可以将该黑名单降至一个小清单。
    【解决方案6】:

    试一试:

    $str = '<p>paragraph</p><a href="http://www.google.com/" target="_blank" title="<>">google -> foo</a><div>In the div</div>';
    // first, extract anchor tag
    preg_match("~<a .*?</a>~", $str, $match);
    // then strip the HTML tags
    echo strip_tags($match[0]),"\n";
    

    输出:

    google -> foo
    

    【讨论】:

      【解决方案7】:

      这里的许多正则表达式对我没有帮助。其中一些删除了锚点内的内容(这根本不是 OP 要求的),而不是所有的内容,其中一些会匹配任何以 a 开头的标签,等等。

      这是我根据工作需要创建的。我们遇到了一个问题,将 HTML 传递给具有锚标记(具有许多数据属性和其他属性)的 wkhtmltopdf 有时会阻止 PDF 生成,所以我想在保留文本的同时删除这些。

      正则表达式:

      /?a([^>]*)?>/ig

      在 PHP 中你可以这样做:

      $text = "<a href='http://www.google.com/'>Google1</a><br>" .
              "<a>Google2</a><br>" .
              "<afaketag href='http://www.google.com'>Google2</afaketag><br>" .
              "<afaketag>Google4</afaketag><br>" . 
              "<a href='http://www.google.com'><img src='someimage.jpg'></a>";
      echo preg_replace("/<\/?a( [^>]*)?>/i", "", $text);
      

      输出:

      Google1<br>Google2<br><afaketag href='http://www.google.com'>Google2</afaketag><br><afaketag>Google4</afaketag><br><img src='someimage.jpg'>
      

      【讨论】:

        猜你喜欢
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-22
        • 2015-03-09
        • 1970-01-01
        • 2018-03-05
        • 2015-03-16
        相关资源
        最近更新 更多