12

我使用 PHP。

我的字符串看起来像这样

This is a string-test width åäö and some über+strange characters: _like this?

问题

有没有办法删除非字母数字字符并用空格替换它们?以下是一些非字母数字字符:

  • -
  • +
  • _
  • ?

我已经阅读了很多关于它的主题,但它们不支持其他语言,比如这个:

preg_replace("/[^A-Za-z0-9 ]/", '', $string);

要求

  • 我的无字母字符列表可能不完整。
  • 我的内容包含不同语言的字符,例如 åäöü。可能还有很多。
  • 非字母数字字符应替换为空格。否则这个词会粘在一起。
4

4 回答 4

32

你可以试试这个:

preg_replace('~[^\p{L}\p{N}]++~u', ' ', $string);

\p{L}代表所有字母字符(无论字母表)。

\p{N}代表数字。

带有 u 修饰符的主题字符串的字符被视为 unicode 字符。

或这个:

preg_replace('~\P{Xan}++~u', ' ', $string);

\p{Xan}包含 unicode 字母和数字。

\P{Xan}包含所有非 unicode 字母和数字。(请注意,它也包含空格,您可以使用 保留~[^\p{Xan}\s]++~u

如果您想要一组更具体的允许字母,则必须用unicode table\p{L}中的范围替换。

例子:

preg_replace('~[^a-zÀ-ÖØ-öÿŸ\d]++~ui', ' ', $string);

为什么在这里使用所有格量词(++)?

~\P{Xan}+~u会给你同样的结果~\P{Xan}++~u。这里的区别在于,在第一个引擎记录每个回溯位置(我们不需要),而在第二个它不记录(如在原子组中)。结果是很小的业绩利润。

我认为在可能的情况下使用所有格量词和原子组是一个好习惯。

a+b但是,PCRE 正则表达式引擎在明显的情况下(例如: => )自动使量词具有所有格,a++b除非 PCRE 模块已使用选项 PCRE_NO_AUTO_POSSESS 编译。( http://www.pcre.org/pcre.txt )

有关所有格量词和原子组的更多信息here(占有量词)here(原子组)here

于 2013-05-07T19:33:29.153 回答
3

你也许在寻找\W

就像是:

/[\W_]*/

匹配所有非字母数字字符和下划线。

\w匹配所有单词字符(字母、数字、下划线)

\W匹配任何不在\w.

因此,\W匹配任何非字母数字字符并添加下划线,因为\W不匹配下划线。

编辑:这使您的代码行变为:

preg_replace("/[\W_]*/", ' ', $string);

' '意味着所有匹配的字符(不是字母也不是数字)都将变成空格。

重新编辑:您可能还想使用另一个preg_replace来删除所有连续的空格并将它们替换为单个空格,否则您最终会得到:

This is a string test width     and some  ber strange characters   like this 

您可以使用:

preg_replace("/\s+/", ' ', $string);

最后修剪开头和结尾的空格(如果有的话)。

于 2013-05-07T19:31:06.073 回答
2

我不完全确定您使用的是哪种正则表达式。但是,POSIX 正则表达式允许您表达一个字母类,其中 [:alpha:] 表示任何字母字符。

所以试试:

preg_replace("/[^[:alpha:]0-9 ]/", '', $string);

实际上,我忘记了 [:alnum:] - 这使它更简单:

preg_replace("/[^[:alnum:] ]/", '', $string);
于 2013-05-07T19:30:58.667 回答
1

\p{xx}是你要找的,我相信, 看这里

所以,试试:

preg_replace("/\P{L}+/u", ' ', $string);
于 2013-05-07T19:33:34.933 回答