【问题标题】:Remove HTML tags except <a> and convert reserved to entities, keeping <a> in tact删除除 <a> 之外的 HTML 标记并将保留转换为实体,保持 <a> 完整
【发布时间】:2012-09-27 18:04:06
【问题描述】:

使用 PHP,如何从 HTML 字符串中删除除锚点 (&lt;a&gt;) 之外的所有标签,然后将所有保留字符转换为它们的 HTML 实体,但 &lt;a&gt; 标签除外?

例如,我会转换这个:

<p><a href="http://www.example.com/">Example.com</a> says that 5 < 6.</p>

进入这个:

<a href="http://www.example.com/">Example.com</a> says that 5 &lt; 6.

【问题讨论】:

  • 使用正则表达式,查看此处发布的答案 - stackoverflow.com/a/1736801/125551
  • 感谢您的链接。我可以使用该正则表达式将锚点替换为一些字符串,并在使用 strip_tags 和 htmlentities 后将其放回原处。还有其他想法吗?
  • &lt;a&gt; 标签是不是文本节点的父节点?
  • 可能,这使得它更加困难。我正在将 HTML 电子邮件转换为文本,因此它可以是锚文本节点内的任何内容。我可以在剥离标签之前提取链接,将超链接放在结束锚标签旁边,然后剥离标签,但这不是很好看。

标签: php email html-entities strip-tags


【解决方案1】:

我选择了HTML PurifierClick here for the demo which converts the original example 正确。

执行此操作的代码是:

$config = HTMLPurifier_Config::createDefault();
$config->set('Core.Encoding', 'UTF-8');
$config->set('HTML.Allowed', 'a[href]');
$filter = new HTMLPurifier($config);
$output = $filter->purify($input);

【讨论】:

    【解决方案2】:

    这个怎么样:

    $str = '<p><a href="http://www.example.com/">Example.com</a> says that 5 < 6.</p>';
    echo $str."\n";
    $stripped = strip_tags($str, '<a>');
    echo $stripped."\n";
    

    产生输出:

    [stou$ ~]$ php hmm.php 
    <p><a href="http://www.example.com/">Example.com</a> says that 5 < 6.</p>
    <a href="http://www.example.com/">Example.com</a> says that 5 < 6.
    [stou$ ~]$
    

    编辑:抱歉错过了您关于 html 实体的观点。

    【讨论】:

    • 谢谢,但我需要 5 和 6 之间的小于号为 &amp;lt;
    • 没关系,这很微妙。 :)
    猜你喜欢
    • 2016-05-10
    • 1970-01-01
    • 2018-10-06
    • 2011-05-13
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多