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

PHP-用于特殊字符字符串的正则表达式,php,regex,Php,Regex,早上好。我试图确定字符串是否包含特定字符的列表 我知道我应该用这个,但我的正则表达式知识是可悲的,我一直无法收集任何信息从其他帖子在这个网站上。因为它们中的大多数只想将字符串限制为a-z、a-z和0-9。但我确实希望允许使用一些特殊字符,例如:!@英镑和其他不在以下字符串中的内容 要匹配的字符:\$%^&*()+=-[]\',./{}|\“:?~ private function containsIllegalChars($string) { return preg_match([REG

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

我知道我应该用这个,但我的正则表达式知识是可悲的,我一直无法收集任何信息从其他帖子在这个网站上。因为它们中的大多数只想将字符串限制为a-z、a-z和0-9。但我确实希望允许使用一些特殊字符,例如:
!@英镑
和其他不在以下字符串中的内容

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

private function containsIllegalChars($string)
{
    return preg_match([REGEX_STRING_HERE], $string);
}
我最初是用Javascript编写匹配的,它只是在字符串中的每个字母之间循环,然后在另一个字符串中的每个字符之间循环,直到找到匹配。回想起来,我简直不敢相信我甚至尝试使用这样一种古老的方法。随着json的出现(以及应用程序的重写!),我将匹配切换到php,通过json返回错误消息

我希望正则表达式专家能够帮助将上述字符串转换为正则表达式字符串,但任何反馈都将不胜感激!

Regexp对于“不允许字符列表”不是强制性的

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

下面是一个用法示例

$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;
}
$tests=数组(
“你好,我应该被允许”,
“啊!我不被允许”,
“天哪,又一个”,
"=)",
""
);
$INLOCALL=“#$%^&*()+=-[]”/{}|:?~";
foreach($tests作为$test){
回声试验;
回声“=>”;
echo(false==strpbrk($test,$非法))?“允许”:“不允许”;
echo PHP_EOL;
}

$pattern=preg_quote('.$%^&*()+=-[]\',./{}124;\“:?~','.\);
var_dump(preg_match(#[{$pattern}]#“,'hello world');//假的
var|u dump(preg|u match(“#[{$pattern}]#”,“he | | o wor | d'))//真的
var_dump(preg_match(“#[{$pattern}]#”,“$uper duper”);//真的
很可能,您可以缓存
$pattern
,具体取决于您的实现

(尽管在正则表达式之外,您也最好使用这里提到的方法)

返回preg\u match('/[\$%^&*()+=\-\[\]\',.\/{}\\\\\\”:?~\\\\]/',$string);

我认为,通过包含您希望允许的字符,可以大大简化您要查找的内容,例如:

preg_match('/[^\w!@£]/', $string)
下面是正在发生的事情的快速分解:

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

呃……Unicode目录包含100000多个字符。你确定只想过滤掉你列出的几个字符吗?你不喜欢白名单方法吗?幸运的是,在这种情况下,黑名单就足够了。公平地说,这会比
preg_match
更有效吗?尽管这不是我想要的询问-这是一个更好的使用解决方案,因此我接受了你的答案,谢谢!注意到这条老评论,给出的测试用例没有针对
preg\u match
进行优化。这不会改变
strpbrk
的效率,但为
preg\u match
提供了一个真正的值,对我提出的问题100%有效,谢谢Arnold。但是看看
strpbrk
,它可能会赢得我最初使用
preg\u match
的想法,你是对的,
strpbrk
更适合我的需要。但是我以前没有看过
preg\u quote
,它似乎是一个非常方便的小功能,所以感谢你指出它!
return preg_match('/[#$%^&*()+=\-\[\]\';,.\/{}|":<>?~\\\\]/', $string);
preg_match('/[^\w!@£]/', $string)