我有一个简单的textarea,用户可以在我的虚拟系统上输入他们产品的描述。我只允许<b>
<u>
和<i>
代码,不使用以下代码的任何属性:
$description = strip_tags($_POST['description'], "<b><u><i>");
$description = preg_replace("/<([a-z][a-z0-9]*)[^>]*?(\/?)>/i",'<$1$2>', $description);
我的问题是当标签没有它关闭部分时,例如:
<b>This is a <i>Test
<b>
和<i>
标记将适用于此部分之后的所有内容。有没有可靠的方法来自动关闭标签?
我想要的是在用户输入结束时关闭标签,但只有在它打开时才会关闭。
答案 0 :(得分:0)
此代码需要一些额外的微调,但它可以帮助您理解这个想法。
$tags = ['b', 'i', 'u'];
foreach($tags as $t){
if($a = substr_count($message, "<$t>") != $b = substr_count($message, "</$t>"){
if($a > $b){
$message .= str_repeat("<$t>", $a - $b);
} else {
// more closing tags then opening.
$message = strrev($message);
str_replace("<$t/>", '', $message, $b - $a);
$message = strrev($message);
}
}
}
$message
包含整个文本区域文本。它计算所有标签,如果存在不一致,它将附加在字符串的末尾。
答案 1 :(得分:0)
我最后通过使用Tidy来解决问题。这是代码:
$tidy = new Tidy();
$description = $tidy->repairString($description, array(
'output-xml' => true,
'input-xml' => true,
'vertical-space' => false
));