PHP mb_ereg_replace删除每个unicode搜索目标之外的其他字符

时间:2016-01-09 19:25:59

标签: php regex string unicode replace

我有要删除的unicode软连字符(U + 00AD)的文本。我试图用PHP的mb_ereg_replace()函数来做这件事。它找到了软连字符,但是替换过程正在删除软连字符和紧跟它们的第一个字符。

我的代码是:

$text_cleansed = mb_ereg_replace('[\u00AD]', '', $text);

例如,如果$text"en-dur-ance"(此处显示的连字符为隐形unicode软连字符),则$text_cleansed将为"enurnce";已删除-d-a,对于每个软连字符,应删除软连字符。因此,mb_ereg_replace删除了每个软连字符后面的第一个字符。当然,我必须在函数中输入不正确的参数。

导致此行为的原因是什么,该函数的正确参数是什么?

3 个答案:

答案 0 :(得分:1)

PHP正则表达式不支持\u表示法。正则表达式中的符号被视为单独的实体,而不是十六进制表示法(如' \ u',' 0',' A',' d'。)

将preg_replace与\x{}表示法一起使用/u修饰符(将模式和输入字符串解释为Unicode字符串所必需的):

preg_replace('~\x{00AD}~u', '', $s) 

请参阅IDEONE demo

答案 1 :(得分:0)

如果你的字符串是UTF8编码的,你不需要考虑你的字符串是多字节来删除ASCII范围(00-7F)中的字符,因为这些字节不用于组成其他字符串字节。在这种情况下,您可以使用str_replace

$result = str_replace('-', '', $text);

答案 2 :(得分:-1)

stribizhev写的是正确的。这是PHP mb_ereg文档中不清楚的语法问题。我已经将他的第二个回复标记为答案之后回答,因为他的第三个回答对我原来的问题有特定的答案(re:多字节字符串 - mb - 而不是常规字符串)。

1)如果使用非多字节字符串,preg_replace('~\x{00AD}~u', '', $text)就是解决方案。

2)如果使用多字节字符串,mb_ereg_replace('[\x{00AD}]', '', $text)就是解决方案。

这是一个语法问题,对那些在正则表达式工作中没有经验的人来说是模糊不清的。幸运的是,这将有助于其他有类似问题的人。