使用白名单正则表达式php清理字符串

时间:2018-08-08 05:41:57

标签: php regex

我想使用下一个白名单对$string进行消毒:

其中包括a-z,A-Z,0-9和帖子[]=+-¿?¡!<>$%^&*'"()/#@*,.:;_|中包含的一些常用字符。
  像á,é,í,ó,úÁÉÍÓÚ

这样的西班牙口音

白名单

abcdefghijklmnñopqrstuvwxyzñáéíóúABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚ0123456789[]=+-¿?¡!<>$%^&*'"()/#@*,.:;_|

我要清理此字符串

 $string="//abcdefghijklmnñopqrstuvwxyzñáéíóúABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚ0123456789[]=+-¿?¡!<>$%^&*'()/#@*,.:;_| |||||||||| ] ¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶¸¹º»¼½ mmmmm onload onclick='' [ ? / < ~ # ` ! @ $ % ^ & * ( ) + = } | :  ; ' , > { space !#$%&'()*+,-./:;<=>?@[\]^_`{|}~ <html>sdsd</html> ** *`` `` ´´ {} {}[] ````... ;;,,´'¡'!!!!¿?ña ñaña ÑA á é´´ è ´ 8i ó ú à à` à è`ì`ò ù &  > < ksks < wksdsd '' \" \' <script>alert('hi')</script>";

我尝试过此正则表达式,但不起作用

//$regex = '/[^\w\[\]\=\+\-\¿\?\¡\!\<\>\$\%\^\&\*\'\"\(\)\/\#\@\*\,\.\/\:\;\_\|]/i';
//preg_replace($regex, '', $string);

有人知道如何根据白名单值清理此字符串吗?

1 个答案:

答案 0 :(得分:1)

如果知道您的白名单字符,请在正则表达式中使用白名单,而不要包括黑名单。黑名单可能真的很大。特别是如果编码类似于UTF-8或UTF-16

有很多方法可以做到这一点。一种可能是创建一个具有期望范围(也包括空格和换行)的捕获组的正则表达式,然后用这些组组成一个新字符串。

还要小心一些字符可以保留为正则表达式字符,并且需要转义。就像“ [?+”

您可以像这样测试regex

$string ="Your test string";
$pattern= "([a-zA-Z0-9\[\]=\+\-\¿\?¡!<>$%\^&\*'\"\sñÑáéíóúÁÉÍÓÚ]+)";
preg_match_all($pattern, $string, $matches);
$newString =  join('', $matches);

这是如何与正则表达式一起应用白名单的唯一简单示例。