在PHP中从字符串中移除所有连字符、特殊字符等。

5
有没有一般性的正则表达式可以去除所有连字符、特殊字符等,以便只获取字母。

例如,一个包含以下内容的正则表达式:,./<>?;':"|[]{}-=_+1234567890!@#$%^&*()|\ ~` 和所有连字符和特殊字符。

(不知道这是否称为正则表达式,但我希望你能理解这个想法)

你只想获取 a-zA-Z 而不包括数字吗? - AKS
正则表达式作为白名单: [a-z],使用 /i 开关进行不区分大小写的匹配,如果只想要字母(如果需要非ASCII字母,请说明)。 - Mark Baker
为什么不尝试在 str_replace("/your_removal_list/", "", $str) 中使用这个呢? - Murad Hasan
@FrayneKonok 这意味着 OP 需要做大量的 str_replace(),而在这种情况下使用 preg_replace() 不是很好。 - Chay22
@Chay22,原文作者并未提及需要多少个字符,因此我提出了这些建议。 - Murad Hasan
@FrayneKonok 你说得对。但是,“ALL”这个词好像正好符合我的情况:D - Chay22
2个回答

7
这应该可以工作:
$string = preg_replace("/[^a-zA-Z]+/", "", $string);

如果想保留数字,可以使用这个:
$string = preg_replace("/[^a-zA-Z0-9]+/", "", $string);

看起来它连字母都删除了,现在什么也不显示 :p - Maarten Wolfsen
i开关用于不区分大小写的情况下。 - Mark Baker
我 switch?那是什么? - Maarten Wolfsen
@MaartenWolfsen - i开关将使用$string = preg_replace("/[^a-z]+/i", "", $string);(请注意正则表达式中终止符号后面的i,它表示对正则表达式解析器不区分大小写) - Mark Baker
不需要使用“switch”(它被称为修饰符)与\P{L}一起。 - Wiktor Stribiżew

2

如果您只需要字母,请删除所有非字母字符:

preg_replace('~\P{L}+~u', '', $input)
\P{L}是一个Unicode属性,匹配除Unicode字母外的所有字符。请参见正则表达式演示 如果您还需要处理变音符号(即如果您需要保留它们),请使用。
preg_replace('~[^\p{M}\p{L}]+~u', '', $input)

\p{M} 匹配任何变音符号,[^\p{M}\p{L}]+ 匹配一个或多个非字母和变音符号字符。

请参见另一个演示


几乎可以工作,但它不能删除连字符。 - Maarten Wolfsen
仍然不会移除 / - 和 _。 - Maarten Wolfsen
@MaartenWolfsen:你应该展示一下代码,在正则表达式之前它是如何处理的。这个正则表达式移除除了字母以外的所有符号 - Wiktor Stribiżew

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