阻止PHP回显特定标签(但仍回显其他标签)

时间:2018-08-27 20:04:48

标签: php html

我一直在想是否可以将打印中的特定HTML标签“列入黑名单”(但是 still 允许其他标签回显,而不允许strip_tags回显)。

所以基本上,如果我想阻止h1标签,而不是:

Hello World

我的代码会回声:

<h1>Hello World</h1>

你们中的每个人都知道是否有可能,如果有可能,我应该怎么做才能实现这一目标?

1 个答案:

答案 0 :(得分:1)

一种使标签不可渲染的方法是使用大括号的字符实体替换标签。例如:

$string = "<h1>foobar</h1>";
$unrender = str_replace(array('<', '>'), array('&lt;', '&gt;') ,$string);
echo $unrender;

哪个返回:

&lt;h1&gt;foobar&lt;/h1&gt;

哪个呈现如下:

  

foobar

下一步是使它成为一个基本功能,它将处理给定字符串中的所有标签:

function unrender($element) {
    $lbracket = '/<(.*?)/';
    $rbracket = '/>/';
    $l = preg_replace($lbracket, '&lt;', $element);
    $r = preg_replace($rbracket, '&gt;', $l);

    return $r;        
}

$string = "<h1>foobar</h1><br />";
echo unrender($string);

您得到:

&lt;h1&gt;foobar&lt;/h1&gt;&lt;br /&gt;

哪个呈现如下:

  

foobar


下一个改进是允许列入黑名单的标签列表。在这一点上,我不得不说a PHP DOM parser使执行这样的操作变得容易得多。这是建议的过程:

  1. 对于$blacktag = array('h1', 'h2', 'p');之类的数组中的每个标签,定位要渲染的标签(除非使用DOM解析器,否则涉及正则表达式)
  2. 通过正确替换尖括号将列表中的标签取消显示。

表面上看这很容易,但是请考虑匹配的标签不匹配。开头与结尾不同(借助/)。然后,考虑到您可能会遇到这样的情况,其中看起来像标签的东西不是

H20是水,而不是标签

这成为相当复杂的挑战。甚至传递文本和要取消渲染的单个标签的“简单”功能也成为一个挑战。