处理用户输入HTML

时间:2018-04-02 18:21:10

标签: php html

我有一个简单的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>标记将适用于此部分之后的所有内容。有没有可靠的方法来自动关闭标签?

我想要的是在用户输入结束时关闭标签,但只有在它打开时才会关闭。

2 个答案:

答案 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
));