我有要删除的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
删除了每个软连字符和后面的第一个字符。当然,我必须在函数中输入不正确的参数。
导致此行为的原因是什么,该函数的正确参数是什么?
答案 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)
就是解决方案。
这是一个语法问题,对那些在正则表达式工作中没有经验的人来说是模糊不清的。幸运的是,这将有助于其他有类似问题的人。