从字符串中删除非字母数字字符(包括 ß、Ê 等)
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:如何从字符串中删除前导/尾随非字母数字字符?