Php 正则表达式的问题
我有这段代码,但没有像我预期的那样工作 如果我写#$%或没有错误的文本,则显示的消息是“正确的”。因此,正则表达式不起作用 我需要避免使用特殊字符、空格和数字Php 正则表达式的问题,php,regex,Php,Regex,我有这段代码,但没有像我预期的那样工作 如果我写#$%或没有错误的文本,则显示的消息是“正确的”。因此,正则表达式不起作用 我需要避免使用特殊字符、空格和数字 function validateCity($form) { if(preg_match("/[\~!\@#\$\%\^\&*()_+\=-[]{}\\|\'\"\;\:\/\?.>\,\<`]/", $form['city'])) { echo ("error"); retur
function validateCity($form) {
if(preg_match("/[\~!\@#\$\%\^\&*()_+\=-[]{}\\|\'\"\;\:\/\?.>\,\<`]/", $form['city'])) {
echo ("error");
return false;
}
else {
echo("correct");
return true;
}
}
validateCity($form);
函数validateCity($form){
如果(preg\u match(“/[\~!\@$\\%\^\&*”),\尝试反转逻辑。查找您想要的字符,而不是您不想要的字符。字符集有一个未替换的“]”,看起来像是集的结尾。您需要转义[
和]
在您的角色类内部。有很多问题-hypen-
应该移到第一个或结尾,或者转义,否则它将被视为指示范围。[]
必须转义
在这样的地方试试你想要的
此外,您还包含了很多内容。只需使用类似\w+
的内容作为有效名称的匹配,而不是查找无效名称。您似乎想检查您的城市名称是否包含任何非字母字符。在这种情况下,您可以将其简化为:
if (preg_match("/[^A-Z]/i", $form['city'])) {
这里有几个问题。最严重的问题是正则表达式中有语法错误:到目前为止,我注意到[
,]
,和-
在你的角色类中都是不可替换的。我有点惊讶正则表达式引擎没有从中出错,因为它们在技术上会导致未定义的行为,但是PHP倾向于对这些事情非常宽容。不管怎样,它都没有做你认为的事情
在担心这一点之前,先解决第二个问题:你将角色列入黑名单,但你应该使用白名单。这将大大简化你的模式,你不必担心像这样疯狂的角色▲ 溜过你的正则表达式
如果你想匹配城市,我会这样说:
if(preg_match("/[^\p{L}\s-]/", $form['city'])) {
echo ("error");
return false;
}
//etc...
这将允许字母、破折号(想想北卡罗来纳州的温斯顿·塞勒姆)和空格(想想北卡罗来纳州的纽黑文),同时阻止所有其他内容。我不知道,这可能限制太多了;欢迎任何知道某个城镇名称中有数字的人发表评论。然而,\p{L}
应该匹配unicode字母,所以Āhualoa,HI应该可以工作。你只能接受字母吗?试试看/[^A-Z]/iside注意:城市名称可以包含空格,例如“Santa Fe”@Wire-对不起,我的错。我在\p{L}
中漏掉了反斜杠。现在似乎可以工作了(在上测试)。