PHP 重音字符的正则表达式

PHP Regex for Accented Characters

我尝试过滤允许字母数字、spaces、重音字符和单引号的变量,并将 reste 替换为 space,这样的字符串如下:

substitué à une otage % ? vendredi 23 mars lors de l’attaque

应该输出:

substitué à une otage vendredi 23 mars lors de l’attaque

但我得到的结果是输出:

substitué à une otage vendredi 23 mars lors de l

请帮忙,这是我的代码

$whitelist = "/[^a-zA-Z0-9а-àâáçéèèêëìîíïôòóùûüÂÊÎÔúÛÄËÏÖÜÀÆæÇÉÈŒœÙñý',. ]/";

$descreption =  preg_replace($whitelist, ' ', $ds);
}else{
    $errors = self::DESCREPTION_ERROR;
    return false;
}

你的正则表达式有问题。 а-à 部分给出了错误 Character range is out of order - 我猜 - 是错误添加的...

然后小提示:不是'

[^a-zA-Z0-9àâáçéèèêëìîíïôòóùûüÂÊÎÔúÛÄËÏÖÜÀÆæÇÉÈŒœÙñý'’,. ] 

应该可以正常工作。

此外,如果您使用的是 Regex,RegExr or regex101 之类的工具真的很棒。

处理重音字符范围的一种方法是使用 POSIX [:alnum:] class,它在 PHP 中与 u 修饰符将匹配所有这些。然后可以将其与您要保留的其他字符一起放入否定字符 class 中,以允许删除其他字符:

$string = 'substitué à une otage % ? vendredi 23 mars lors de l’attaque';
echo preg_replace("/[^[:alnum:]'’,.]/u", ' ', $string);

输出:

substitué à une otage vendredi 23 mars lors de l’attaque

正如评论中指出的那样,' 不同,因此还需要将其添加到您要保留的字符集中。

Demo on 3v4l.org

你可以看看Unicode character properties

我的修改总结:

  • 使用\p{L}匹配所有字母
  • 转义连字符 (\-)
  • 支持打字机 (') 和排版 () 撇号

结果如下:

$whitelist = '/[^\p{L}0-9\-\'’,. ]/u';

可能还有进一步改进的空间。最后,不要忘记添加 u modifier!