如何在PHP中使用UTF-8支持替换所有非字母字符

9

我想从字符串中删除所有非字母字符。问题在于,我不知道字母范围,因为它是UTF8字符串。

它可以是英语,ՀԱՅԵՐԵՆ,ქართული,УКРАЇНСЬКИЙ,РУССКИЙ。

我通常会这样做:

$str = preg_replace('/[^a-zA-Z]/', '', $str);

或者

$str = preg_replace('/[^\w]/u', '', $str);

但是它们都清除了外语字符。 有什么想法吗?
3个回答

10

1
值得一提的是,在使用u标志时指定Unicode字符类的语法需要用花括号将代码点括起来。例如,[\x{0400}-\x{04FF}]匹配任何在常规西里尔语范围内的字符。 - cleong
你需要如何更改正则表达式,以便同时保留数字(与字母一起),而不是将它们删除? - Avatar

8

更新:对于Unicode,RegExp将如下所示[^\p{L}\s]+(不替换空格)

它将用UTF8支持替换所有非字母字符。

  • \P{L}+ - 匹配任何非字母符号
  • \p{P}+ - 仅删除标点符号

以下是一些有用的参考文档:


“字母”并不仅指英文中使用的字符。 - cleong
@cleong,抱歉,是我的错,我漏掉了那个点。我已经更正了我的答案。 - Paul T. Rawkeen
我认为两个答案都很好,但我认为这个提供了更多的信息。 - Mirko Akov

1

字母的Unicode属性为\pL,非字母的为\PL

$str = preg_replace('/\PL+/u', '', $str);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接