11

早上好。我正在尝试确定字符串是否包含特定字符的列表。

我知道我应该为此使用preg_match,但我的正则表达式知识很糟糕,我无法从本网站的其他帖子中收集任何信息。因为他们中的大多数只想将字符串限制为 az、AZ 和 0-9。但我确实希望允许一些特殊字符,例如:! @ £和其他不在下面的字符串中。

要匹配的字符:# $ % ^ & * ( ) + = - [ ] \ ' ; , . / { } | \ " : < > ? ~

private function containsIllegalChars($string)
{
    return preg_match([REGEX_STRING_HERE], $string);
}

我最初用 Javascript 编写匹配,它只是遍历字符串中的每个字母,然后遍历另一个字符串中的每个字符,直到找到匹配项。回想起来,我不敢相信我什至试图使用这种古老的方法。随着 json 的出现(以及应用程序的重写!),我将匹配切换到 php,以通过 json 返回错误消息。

我希望正则表达式大师可以帮助将上述字符串转换为正则表达式字符串,但任何反馈都将不胜感激!

4

4 回答 4

14

“不允许的字符列表”的正则表达式不是强制性的。

你可以看看strpbrk。它应该做你需要的工作。

这是一个使用示例

$tests = array(
    "Hello I should be allowed",
    "Aw! I'm not allowed",
    "Geez [another] one",
    "=)",
    "<WH4T4NXSS474K>"
);
$illegal = "#$%^&*()+=-[]';,./{}|:<>?~";

foreach ($tests as $test) {
    echo $test;
    echo ' => ';
    echo (false === strpbrk($test, $illegal)) ? 'Allowed' : "Disallowed";
    echo PHP_EOL;
}

http://codepad.org/yaJJsOptT

于 2012-12-20T11:09:29.020 回答
11
return preg_match('/[#$%^&*()+=\-\[\]\';,.\/{}|":<>?~\\\\]/', $string);
于 2012-12-20T11:10:38.213 回答
3
$pattern = preg_quote('#$%^&*()+=-[]\';,./{}|\":<>?~', '#');

var_dump(preg_match("#[{$pattern}]#", 'hello world')); // false
var_dump(preg_match("#[{$pattern}]#", 'he||o wor|d')); // true
var_dump(preg_match("#[{$pattern}]#", '$uper duper')); // true

可能,您可以缓存$pattern,具体取决于您的实现。

虽然在正则表达式之外看,你最好也strpbrk像这里提到的那样)

于 2012-12-20T11:10:35.180 回答
1

我认为通过包含您想要允许的字符可以大大简化您正在寻找的内容,如下所示:

preg_match('/[^\w!@£]/', $string)

以下是正在发生的事情的快速细分:

  • [^] = 不包括在内
  • \w = 字母和数字
  • !@ £ = 您还希望允许的字符列表
于 2015-12-30T20:48:14.897 回答