删除或替换零宽度非连接符字符。

3

2
你能否请发一下你用于删除字符的代码? - Miro Markaravanes
$old = "علی‌ها"; 我想要 $new = "علیها"; - Ehsan
2个回答

7

str_replace可以解决这个问题,只要你注意替换的内容。

// \xE2\x80\x8C is ZERO WIDTH NON-JOINER
$foo = "foo\xE2\x80\x8Cbar";

print($foo . " - " . strlen($foo) . "\n");
$foo = str_replace("\xE2\x80\x8C", "", $foo);
print($foo . " - " . strlen($foo) . "\n");

输出结果如预期:

foo‌bar - 9
foobar - 6

你知道那种代码的名称是什么吗?(我的意思是\xE2\x80\x8C)它的名称是什么? - Mohammad Kermani
1
通常只需要使用转义序列或转义代码。它们可能因语言而异,但大多数语言都实现了共同的子集(例如\x,\n,\r等)。@Kermani - MatsLindh

0

str_replace可以实现你想要的功能,但是PHP对Unicode的本地支持不是很好。以下代码可以实现你的需求。由于PHP不支持\u语法,因此使用了json_decode来获取Unicode字符。

<?php
$unicodeChar = json_decode('"\u200c"');
$string = 'blah'.$unicodeChar.'blah';
echo str_replace($unicodeChar, '', $string);
?>

编辑:虽然我的方法可行,但我建议您使用fiskfisk的解决方案。它比使用json_decode更加专业。


1
对于任何遇到这个问题的人,PHP在2015年的PHP 7.0版本中添加了对Unicode字面量的支持,使用语法"\u{200C}" - IMSoP

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