我正在编辑一个现有的项目,有一个错误报告说,如果数字在输入中第一位,系统不接受,比如99%Creative。但是,如果您要输入Creative 99%,系统会接受它并将其保存在数据库中。
我检查了现有的代码,发现他们在preg_match中使用了这个表达式/^[''p{L}]+/u。我在谷歌上搜索了一下,发现用了-w,但我的学长不接受我的答案。他说这是不可接受的。这会引起一些问题。
请检查下面的脚本,这是我使用的脚本:
$category= trim($_POST['category']);
if(preg_match('/'W/', $category)){
$error='Invalid Input';
}
他告诉我测试一下,如果它能像阿拉伯文本一样接受(字母数字+阿拉伯),就用一些unicode字符。这一切都很好,所以它意味着它很好,但他仍然不接受。他告诉我制定另一个正则表达式。
你知道我该怎么办吗?我能用什么表达呢。我真的不明白为什么w不能被接受。
关于PCRE转义序列的PHP手册说,在PCRE中,'w
匹配的字符取决于语言环境(而'W
是'w
的否定)。
这在全局环境中是不可接受的,因为您不知道所使用的服务器区域设置。最后一次setlocale()
呼叫是什么?网站是在美国、法国还是在中国?你永远不会知道。今天可能适用的,明天可能不适用。用户改变,网站也会移动。
例如,您的前辈的服务器可能会使用与您的服务器不同的区域设置。因此,他们可能说得对,对于不在当前语言环境中的某些字符,这对他们不起作用。
这就是为什么他们不能接受你的解决方案。您需要使用Unicode字符属性。
/^['p{L}]+/u
意思是"匹配以Unicode字母开头的字符串"。它将匹配字符串Creative 99%
中的Creative
。
PCRE正则表达式中的'w
匹配ASCII字母、数字和下划线。
如果您将数字添加到字符类中,以数字开头的字符串也将被接受。
/^['p{L}'p{N}]+/u
将与字符串CCD_ 9中的CCD_。
'p{L}
表示任何unicode字母,'w
表示[a-zA-Z0-9_]
。
您可以使用而不是'w
:
['p{L}'p{N}]+
这意味着字母或数字一次或多次。