从字符串中删除非字母数字字符(包括 ß、Ê 等)

Posted

技术标签:

【中文标题】从字符串中删除非字母数字字符(包括 ß、Ê 等)【英文标题】:Remove non-alphanumeric characters (including ß, Ê, etc.) from a string 【发布时间】:2011-11-08 10:53:24 【问题描述】:

是否有一种简单的方法可以从 php 中的字符串中删除所有非字母数字字符,而无需在正则表达式函数中单独列出它们?

我过去一直使用preg_replace("/[^a-zA-Z0-9\s\'\-]/", "", $my_string);,但这会过滤掉ÀÈÌÒÙß等重要字符。

我需要清理名称字段,因此不需要货币和数学字符/符号。

【问题讨论】:

是什么让您列出的那些字符很重要但Þ 不重要? (例如)或一大堆其他人。如果您要允许使用 Mu,为什么不使用 Pi 或其他希腊字母?如果允许日元,为什么不允许英镑和美元?我想问题是你在哪里画线 - 你想排除哪些字符,为什么?那些不适用于µ 的字符有什么特别之处? 从技术上讲,有一些代码点具有\palphabetic 属性,既不是\pL 也不是\pN,大多数人都满足于将[\pL\pN] 用于字母数字,尤其是自从PHP似乎不支持 UTS#18 RL1.2 在兼容性属性上所需的 \palphabetic 属性。 你是对的@Spudley。我修改了问题以澄清,因为在清理名称字段时允许使用数学或货币符号是没有意义的。 Remove non-alphanumeric characters的可能重复 【参考方案1】:

像这样:

preg_replace('/[^\pL\pN\s]/u', '', $my_string);

正如 arnaud576875 已经提到的,您应该知道,在像我一样使用 u 修饰符时,该模式被视为 UTF-8。 appropriate manual page的相关摘录:

你(PCRE8)

此修饰符打开 PCRE 的附加功能,即 与 Perl 不兼容。模式字符串被视为 UTF-8。这 修饰符可用于 Unix 上的 PHP 4.1.0 或更高版本以及 PHP 4.2.3 在 win32 上。自 PHP 以来检查模式的 UTF-8 有效性 4.3.5.

【讨论】:

请注意 $my_string 必须是 utf8 格式 @arnaud576875:我认为u 修饰符(PCRE8)清楚地表明该模式被视为UTF-8,但你是对的。将使用适当的参考更新我的答案。 无论如何要保持这一点,但不包括下划线被删除?【参考方案2】:

使用 unicode 类别:

preg_replace("/[^\pL\pN\pZs'-]/u", "", $my_string);

【讨论】:

您还需要添加/u 修饰符。它告诉正则表达式引擎目标字符串是 UTF-8,这就是如何知道 Unicode 属性转义将起作用。 @Alan:根据 PCRE 文档,您应该能够通过在编译模式时使用 PCRE_UCP 选项或在模式中嵌入 (*UCP) 选项来解决此问题。我发现 PHP 对于它使用的 PCRE 构建选项非常狡猾。例如,this PHP regex tester page 将有 \w 匹配正常的 Unicode 而无需做任何额外的事情。尝试将 “El niño had a nice cafe.”#\w+#i 匹配,您可以很好地理解其中的每一个词,而无需 /u(*UCP)。 PHP 看起来真的很糟糕,因为这一切都是完全不可预测的。

以上是关于从字符串中删除非字母数字字符(包括 ß、Ê 等)的主要内容,如果未能解决你的问题,请参考以下文章

从字符串中删除非字母数字字符

如何从 Python 的数据框列中的字符串中删除非字母数字字符?

SQL Server:如何从字符串中删除前导/尾随非字母数字字符?

从字符串中删除非数字字符(不包括句点和逗号)(即删除除数字、逗号和句点之外的所有字符)

快速从字符串中删除所有非数字字符

删除批处理变量中的非字母数字字符