错误:在PHP中进行preg_match_all时,在偏移量错误处不重复任何内容

错误:在PHP中进行preg_match_all时,在偏移量错误处不重复任何内容,php,regex,Php,Regex,我需要找出文件名是否包含一些我不想要的特殊字符 我实际上在使用这个代码: $files = array("logo.png", "légo.png"); $badChars = array(" ", "é", "É", "è", "È", "à", "À", "ç", "Ç", "¨", "^", "=", "/", "*", "-", "+", "'", "<", ">", ":", ";", ",", "`", "~", "/", "", "|", "!", "@", "#",

我需要找出文件名是否包含一些我不想要的特殊字符

我实际上在使用这个代码:

$files = array("logo.png", "légo.png");
$badChars = array(" ", "é", "É", "è", "È", "à", "À", "ç", "Ç", "¨", "^", "=", "/", "*", "-", "+", "'", "<", ">", ":", ";", ",", "`", "~", "/", "", "|", "!", "@", "#", "$", "%", "?", "&", "(", ")", "¬", "{", "}", "[", "]", "ù", "Ù", '"', "«", "»");
$matches = array();

foreach($files as $file) {
    $matchFound = preg_match_all("#\b(" . implode("|", $badChars) . ")\b#i", $file, $matches);
}
if ($matchFound) {
    $words = array_unique($matches[0]);
    foreach($words as $word) {
        $results[] = array('Error' => "Forbided chars found : ". $word);
    }
}
else {
    $results[] = array('Success' => "OK.");
}
即:

$matchFound = preg_match_all("#\b(" . implode("|", $badChars) . ")\b#i", $file, $matches);

有任何帮助或线索吗?

这是因为您的字符中有
*
,它试图重复上一个字符,在您的情况下,该字符最终是
|
,这是无效的。您的正则表达式变成:

..... |/|*|-| .....
在循环之前映射到您的角色数组,您就会没事了:

$badChars = array_map( 'preg_quote', $badChars);

只要确保在调用
preg_quote()
时没有指定分隔符
,就必须在
$badChars
数组中手动转义它。

这是因为
*
+
是量词。因为它们没有被转义,所以您会得到以下错误:
|?
显然没有什么可重复的

对于您的任务,您不需要使用替换,字符类就足够了:

if (preg_match_all('~[] éèàç¨^=/*-+\'<>:;,`\~/|!@#$%?&()¬{}[ù"«»]~ui', $file, $m)) {
    $m = array_unique($m[0]);
    $m = array_map(function ($i) use ($file) { return array('Error' => 'Forbidden character found : ' . $i . ' in ' . $file); }, $m);
    $results = array_merge($results, $m);
}
if(pregèu matchèu all('~[]èèèèèè^=/*-+\':;,`~~~/|!@$%?&({}[249;«»]~ ui',$file,$m)){
$m=数组_唯一($m[0]);
$m=array_映射(函数($i)使用($file){返回数组('Error'=>'找到的禁止字符:'.$i.'in'.$file);},$m);
$results=array\u merge($results,$m);
}

或者可能是这样的模式:
~[^[:alnum:]~

第一行出现了一个
解析错误:语法错误,意外','
。答案已更改,请刷新浏览器。看起来不错,但我找到了这个
禁用字符:数组
,而我希望
禁用字符:例如+
。我如何更改它?我可以使用
$file
名称吗?只是为了说出在$file中找到的
禁止字符
if (preg_match_all('~[] éèàç¨^=/*-+\'<>:;,`\~/|!@#$%?&()¬{}[ù"«»]~ui', $file, $m)) {
    $m = array_unique($m[0]);
    $m = array_map(function ($i) use ($file) { return array('Error' => 'Forbidden character found : ' . $i . ' in ' . $file); }, $m);
    $results = array_merge($results, $m);
}