PHP - 一串特殊字符的正则表达式

时间:2012-12-20 10:47:01

标签: php regex

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

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

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

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

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

我希望正则表达式大师可以协助将上面的字符串转换为正则表达式字符串,但任何反馈都会受到赞赏!

4 个答案:

答案 0 :(得分:13)

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

您可以查看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/yaJJsOpT

答案 1 :(得分:7)

return preg_match('/[#$%^&*()+=\-\[\]\';,.\/{}|":<>?~\\\\]/', $string);

答案 2 :(得分: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

答案 3 :(得分:1)

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

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

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

  • [^] =不包括
  • \ w =字母和数字
  • ! @£=您还希望允许的字符列表