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


PHP mb_ereg_replace deleting additional characters beyond each unicode search target

我有要删除的带有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删除了每个软连字符和后面的第一个字符。当然,我一定是在向函数中输入错误的参数。

是什么导致了这种行为,函数的正确参数是什么?

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

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

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

请参阅IDEONE演示

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

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

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

这是一个语法问题,对于那些没有regex工作经验的人来说是模糊的。幸运的话,这将帮助其他有类似问题的人。

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

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