请告诉我如何允许少于字符'<'在strip_tags()
代码段
$string ="abc<123";
StringFromUser($string);
function StringFromUser($string)
{
if (is_string($string))
{
return strip_tags($string);
}
}
输出:abc
预期产出abc <123
答案 0 :(得分:1)
首先正确编码。
$string ="abc<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;
}
}