PHP:如何从字符串中删除特定字符(除了某些字符)

3

你好,我尝试使用正则表达式编写以下代码:

$str =  preg_replace("/[^a-z0-9_]/i", '', 'New_text % *');

//output => New_text

( _ 代表除外字符 )

所有功能都很完美,但当我的输入字符串像其他语言(如印地语)一样时,印地语中的字符也会被删除。

与上面的示例相同

$str =  preg_replace("/[^a-z0-9_]/i", '', 'कपिल शर्मा % * _');

//output => _

how to get: कपिल शर्मा _

在 PHP 中是否有正则表达式或其他方法可以解决这个问题?


3
请使用\W代替完整字符范围,并添加u修饰符。 - chris85
“a-z” 不包含印地语字母,这一点应该很明显...它们是“拉丁”字母。 - CBroe
那么,你到底允许什么呢?a-z0-9 简单而明确。而“还有印地语”则非常广泛、模糊和不具体。那阿拉伯语、日语和其他语言呢? - deceze
3个回答

2

使用Unicode属性:

$str =  preg_replace("/[^\p{L}\p{N}\p{Z}_]/u", '', 'कपिल शर्मा % * _');

何时使用正则表达式:

  • \p{L} 代表任何语言中的字母
  • \p{N} 代表任何语言中的数字
  • \p{Z} 代表任何种类的分隔符。
  • u 标志用于 Unicode

文档


警告:preg_replace():编译失败:\P或\p后面未知的属性名称 - user3736833
来吧,使用'~\W+~u'。@Toto:\p{Z}不能匹配制表符。也不能匹配垂直空格。 - Wiktor Stribiżew
它给我输出了“कपल शरम”,这不正确,我需要“कपिल शर्मा”。 - user3736833
1
@user3736833,“पि”是什么?也许可以将其添加到字符类中吗?它似乎不是一个单词字符。例如,也许可以使用“[^\wपि]+”? - chris85
@user3736833:看起来一个字符没有包含在范围内,我不懂印地语,但如果在字符类中添加 ि,它就会被保留。 - Toto
显示剩余2条评论

2

您需要使用

'~[^\p{M}\w]+~u'

请查看 正则表达式演示

似乎PHP PCRE正则表达式在使用\W/u修饰符时无法匹配组合标记,因此我们需要使用相应的[^\w]否定字符类并在其中添加一个\p{M} Unicode属性(组合标记)。

在此处查看更多Unicode属性信息


感谢Wiktor Stribiżew。 - user3736833

0

你可以使用filter_var

filter_var('your string &% * _',FILTER_SANITIZE_STRING | FILTER_FLAG_STRIP_HIGH);

或者如果您可以使用小符号,您可以使用str_replace

$arrayRequer = array('*','_','^','%');
str_replace($arrayRequer,'',$yourString);

如果您可以点击“踩”,请不要害怕告诉我原因? - Naumov
只是因为没有人解释原因,我会弥补这一点。今天我也遭遇了类似的负评,即使回答完美地工作并且解释得很好。这不是SO应该有的:因为你不喜欢某些东西而投反对票绝对是邪恶的。 - Wiktor Stribiżew

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