Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 仅回显数字/波斯语/拉丁语字符_Php - Fatal编程技术网

Php 仅回显数字/波斯语/拉丁语字符

Php 仅回显数字/波斯语/拉丁语字符,php,Php,我需要一个干净的字符串 我只想要数字/波斯语/拉丁语 function clean($str) { global $mysqli; $str = @trim($str); if(get_magic_quotes_gpc()) { $str = stripslashes($str); } return mysqli_real_escape_string($mysqli,preg_replace("/^(?!.*[(@#!%$&*)])

我需要一个干净的字符串 我只想要数字/波斯语/拉丁语

function clean($str) {
    global $mysqli;
    $str = @trim($str);
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysqli_real_escape_string($mysqli,preg_replace("/^(?!.*[(@#!%$&*)])[A-Za-z\s\x{0600}-\x{06FF}0-9_\.\-]+$/u","",$str));
}

echo clean('a|"bc!@£d012e^&$ییییfg'); 

i want this =>//echo abcd012eییییfg

i dont want have any => ( @,#,!,%,$,&,|,",£,^* )

让这个旋转一下。它只使用正则表达式:

function clean($str){
   $re = "/([0-9a-zA-Z\x{600}-\x{6FF}])/u";
   preg_match_all($re, $str, $matches);
   return isset($matches[0]) ? implode($matches[0]) : '';
}

echo clean('a|"bc!@£d012e^&$ییییfg');
// output: abcd012eییییfg
echo clean('a|"bc!@Β£d艾β012艾e^&$ییییfg');
// output: abcd012eییییfg
如上所述,波斯字符介于
600
6FF


您可以看到它:

您可以尝试以下正则表达式:

function clean($mysqli,$str) {
    //global $mysqli;   //pass this as a parameter
    if (!is_string($str)) {
        return ""; 
    }
    $str = trim($str);  //Don't need to suppress errors 
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysqli_real_escape_string($mysqli,preg_replace("/[^0-9a-zA-Z\x{600}-\x{6FF}]/u","",$str));
}
作为补充说明:

不要使用
mysqli\u real\u escape\u string
作为清理用户输入的手段,它是不可信的,尤其是在处理UTF-8输入时,请使用准备好的语句。

详细说明:

假设您有以下代码:

  $sql = "INSERT INTO table VALUES(".clean($value).")";
将其更改为:

  $sql = "INSERT INTO table VALUES(?)";

  if (($s=$mysqli->prepare($sql)) {
       $stmt->bind_param("s", preg_replace("/[^0-9a-zA-Z\x{600}-\x{6FF}]/u","",$value)); //MySQL will clean it up.
       $stmt->execute();
  }

我对波斯语字符有点傻,但只保留数字/拉丁语可能是这样的:
preg_replace(“/[^0-9a-zA-Z]/”,“,$str)
也许你可以为波斯语字符指定一个类似的范围(不知道它是否有效)。这允许使用比问题要求更多的语言。e、 g.a.“公元前!@d艾β012艾e^&$یییییfg'也将包括希腊和中国字符。我的坏。做了一些挖掘并找到了波斯字符的范围。我已经更新了答案Global$mysqli;//避免这种情况。globals是邪恶的。$str=@trim($str);//不要抑制错误。那也是邪恶的。你不明白我必须使用这种方法。你推荐一种方法你必须使用
trim
。我明白了,但是你不需要做
@trim
,没有理由。如果trim失败了,你最好知道它,而不是假设它起作用,然后得到一个错误再往下走。