为什么来自post值的mb_strlen和strlen是不正确的PHP?

时间:2016-12-21 16:00:00

标签: php strlen

使用此代码,当我将漢字填入类型为text且名称为text的输入元素并按下提交按钮时,其显示mb_strlen : 16和{{1} }

strlen : 16

但是当使用此代码时,它会显示<?php include("connect.php"); if(isset($_POST["submit"])) { $string = mysqli_real_escape_string($db_mysqli,$_POST['text']); //$string = "漢字"; echo $string."<BR>"; echo "mb_strlen : ".mb_strlen($string, 'utf-8')."<BR>"; echo "strlen : ".strlen($string)."<BR>"; if(strlen($string) != mb_strlen($string, 'utf-8')) { echo "Please enter English words only:("; } else { echo "OK, English Detected!"; } } ?> <form method="post" ENCTYPE = "multipart/form-data"> <input type="text" name="text"> <input type="submit" name="submit" value="OK" id="button-blue" style=" float: none; "> </form> mb_strlen : 2

我想知道,为什么上面代码的值不正确以及如何申请?

strlen : 6

1 个答案:

答案 0 :(得分:0)

这个答案可能会有一些问题 - 需要稍后修订 - 但是我们可以使用Regex来检查输入字符串是否包含非拉丁字符。

而不是使用strlen

代码:

$string = '漢字';
$matches = array();
$pattern = '/^[^\p{Latin}]+$/u';
preg_match($pattern, $string, $matches);
print_r($matches);

结果:

Array
(
    [0] => 漢字
)

如果我使用This is a Latin string jasDLFKL@##$&()@!!!进行测试,我会得到一个空数组。我不相信这是一个万无一失的解决方案,但更好的第一步。

请注意,Regex的拉丁字符范围的定义是U + 0000-U + 007F。这个Regex Tutorial Page详细介绍了Unicode。另请注意,我的模式有一个u标志,用于Unicode。这将是必要的。