PHP strip_tags不允许小于'<'在字符串中

时间:2013-07-15 09:15:23

标签: php strip-tags

请告诉我如何允许少于字符'<'在strip_tags()

代码段

$string ="abc<123";
StringFromUser($string);

function StringFromUser($string)
{

    if (is_string($string))
    {
        return strip_tags($string);

    }

}

输出:abc

预期产出abc <123

4 个答案:

答案 0 :(得分:1)

首先正确编码。

$string ="abc&lt;123";

虽然如果您没有对HTML输出进行清理,但无论如何都不应该使用strip_tags()

答案 1 :(得分:1)

strip_tags清理数据的一种非常基本且不太好的方法(即“将任意值打入形状”)。再次,正如您所看到的,它不是一个非常好的功能。如果你有充分的理由,你应该只清理数据,通常没有充分的理由。问问自己你从任意剥离部分价值中获得了什么。

您要么验证转义以避免语法问题和/或注入攻击。消毒很少是正确的做法。阅读The Great Escapism (Or: What You Need To Know To Work With Text Within Text)以获取有关整个主题的更多背景信息。

答案 2 :(得分:0)

你可以在你的字符串中搜索一个字符,把它取出来,strip_tags()你的字符串然后把字符放回去:

$string = "abc<123";
$character = "<";
$pos = strpos($string,$character);
$tag = ">";
$check = strpos($string,$tag);
if ($pos !== false && $check == false) {
    $string_array = explode("<",$string);
    $string = $string_array[0];
    $string .= $string_array[1];
    $string = strip_tags($string);
    $length = strlen($string);
    $substr = substr($string, 0, $pos);
    $substr .= "<";
    $substr .= substr($string, $pos, $length);

    $string = $substr;
} else {
    $string = strip_tags($string);
}

或者您可以使用preg_replace()替换$ string中不想要的所有字符。

答案 3 :(得分:0)

问题: 使用trip_tags的目的是防止从HTML或PHP注入攻击。但是,trip_tags不仅会删除HTML和PHP标记,还会删除部分数学表达式并使用&lt;运营商。所以,我们看到的是“abc&lt; 123”被替换为“abc”。

解决方案: 我们所知道的是&lt;后跟一个空格未被strip_tags标识为HTML或PHP标记。所以我所做的就是将“abc&lt; 123”替换为“abc&lt; myUniqueID123”。请注意,&lt;&lt;标志。而且,只有数字跟随&lt;标志被替换。接下来,strip_tags字符串。最后,将“abc&lt; myUniqueID123”替换回“abc&lt; 123”。

$string = "abc<123";
echo StringFromUser($string);

function StringFromUser($string)
{
    if (is_string($string)) {
        //change "abc<123" to "abc< myUniqueID123", so math expressions are not stripped.
        //use myQuniqueID to identity what we have changed later.
        $string = preg_replace("/(<)(\d)/", "$1 myUniqueID$2", $string);
        $string = strip_tags($string);
        //change "abc< myUniqueID123" back to "abc<123"
        $string = preg_replace("/(<) myUniqueID(\d)/", "$1$2", $string);
        return $string;
    }
}