Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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_Regex - Fatal编程技术网

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}
中漏掉了反斜杠。现在似乎可以工作了(在上测试)。