我正在编辑现有项目,并且报告了一个错误,如果数字在输入中排在第一位,系统就不接受,例如99%Creative。但是,如果您输入Creative 99%,系统会接受它并将其保存在数据库中。
我检查现有代码,发现他们在preg_match中使用了这个表达式 / ^ [\ p {L}] + / u 。我用Google搜索并发现使用\ w但是我的大四学生不接受我的回答。他说,这是不可接受的。这会产生一些问题。
请查看下面的脚本,这是我使用的脚本:
$category= trim($_POST['category']);
if(preg_match('/\W/', $category)){
$error='Invalid Input';
}
他告诉我测试它,使用一些unicode字符,如果它会接受阿拉伯语文本,混合(字母数字+阿拉伯语)。一切正常,这意味着它很好,但他仍然不接受它。他告诉我要制定另一个正则表达式。
你知道我该怎么办?什么可以是我可以使用的表达。我真的不明白为什么不能接受。
答案 0 :(得分:4)
The PHP manual on PCRE escape sequences表示在PCRE中,\w
匹配的字符取决于区域设置(而\W
是\w
的否定。)
这在全局环境中是不可接受的,因为您不知道使用的服务器区域设置。最后一次setlocale()
电话是什么?该网站是在美国,法国,中国举办的吗?你永远都不会知道。今天可能适用的,可能不会在明天。用户更改,网站确实移动。
例如,您的老人的服务器也可能使用与您的服务器不同的区域设置。所以他们可能是对的,说它不适用于某些不属于当前语言环境的角色。
这就是他们无法接受您的解决方案的原因。您需要改为使用Unicode character properties。
答案 1 :(得分:2)
\p{L}
表示任何unicode字母,\w
表示[a-zA-Z0-9_]
。
您可以使用而不是\w
:
[\p{L}\p{N}]+
这意味着字母或数字一次或多次。
答案 2 :(得分:2)
/^[\p{L}]+/u
表示“匹配以Unicode字母开头的字符串”。它将匹配字符串Creative
中的Creative 99%
。
\w
匹配ASCII字母,数字和下划线。
如果向字符类添加数字,也会接受以数字开头的字符串。
/^[\p{L}\p{N}]+/u
将匹配字符串99
中的99% Creative
。