重音字符的PHP正则表达式

时间:2019-01-03 08:47:53

标签: php regex preg-replace

我尝试过滤一个允许使用字母数字,空格,带重音符号和单引号的变量,并用空格替换剩余字符,这样的字符串就如:

  

替代率%? vendredi 23火星洛斯·德阿塔克

应输出:

  

替换火星人的火星之火

但是我得到的结果是:

  

在Mars lors de l上进行替换或更换

请帮忙,这是我的代码

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

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

3 个答案:

答案 0 :(得分:2)

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

然后是一个小提示:不是'

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

应该工作正常。

此外,如果您正在使用Regex,则RegExrregex101之类的工具确实很棒。

答案 1 :(得分:1)

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

$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

答案 2 :(得分:0)

您可以看看Unicode character properties

我的更改摘要:

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

这是结果:

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

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