PHP - 替换所有非字母数字字符(支持所有语言)

4

你好,我正在尝试替换字符串中所有非字母数字字符,比如这样:

mb_ereg_replace('/[^a-z0-9\s]+/i','-',$string);

第一个问题是它不能替换字符串中像"."这样的字符。

其次,我希望为所有用户语言添加多字节支持。

我该如何做到这一点?

非常感谢您的帮助。


只需将句点添加到您的字符列表中。^a-z0-9\s。至于“添加多字节支持”,如果您的意思是替换重音符号等,我不知道除了制作一个包含像é => e这样的大数组,并将其用于strtr之外的其他方法。 - Ariane
@Ariane,这样可以吗?我的意思是我已经有句号了!?不用担心重音符号;) - itsme
4个回答

11
尝试以下操作:
preg_replace('/[^\p{L}0-9\s]+/u', '-', $string);

使用正则表达式时,若带有u标记,则\p{L}(以及\p{Letter})匹配Unicode字母类别中的任意字符。


哦,伙计,我使用了mb_ereg_replace()。抱歉,我更新了问题@F.J。 - itsme
我应该使用 preg_replace() 吗? :P - itsme
1
抱歉我不太了解mb_ereg_replace(),但是preg_replace()应该可以使用,所以切换是一个可行的选择。 - Andrew Clark

1

它应该将 . 替换为 - ,你可能是在一开始混淆了你的数据。

至于多字节支持,请添加 u 修饰符并查看 PCRE属性,即\ p {Letter}

$replaced = preg_replace('~[^0-9\p{Letter}]+~iu', '-', $string);

哦,伙计,我使用了mb_ereg_replace()。抱歉,我更新了问题@Alix Axel。 - itsme
@badbetonbreakbutbedbackbone:Perl兼容正则表达式(preg)比扩展正则表达式(ereg)更强大。 - Alix Axel

1
最短的方式是:

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

\p{Xan} 包含所有语言中的数字和字母,因此 \P{Xan} 包含所有不是字母或数字的内容。


谢谢,但 mb_ereg_replace() 不是更好吗?你能告诉我是否需要切换到 preg_replace() 以及为什么吗? :P - itsme
1
@badbetonbreakbutbedbackbone:不。在结尾处的u修饰符使得该模式可以处理preg_*函数中的unicode。在我看来,mb_ereg函数将会消失。preg_*函数更快且支持unicode。 - Casimir et Hippolyte

0

这个表达式可以替换点号。对于多字节,请使用u修饰符(UTF-8)。


哦,伙计,我使用了mb_ereg_replace()。抱歉,我更新了问题@Ziarno。 - itsme

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