删除Unicode零宽度空间PHP

时间:2014-03-24 02:43:14

标签: php unicode str-replace

我有缅甸语的文字,UTF-8。我正在使用PHP来处理文本。在此过程中的某些时候,一些ZWSP已经悄悄进入,我想将它们删除。我尝试了两种不同的方法来删除字符,似乎都没有用。

首先我尝试使用:

  $newBody = str_replace("​", "", $newBody);

搜索HTML实体并将其删除,因为它是Web Inspector下的显示方式。这些空间不会被移除。我也尝试过:

  $newBody = str_replace("&#8203", "", $newBody);

并得到相同的结果。

我尝试的第二种方法是在Remove ZERO WIDTH NON-JOINER character from a string in PHP

这个问题上找到的

看起来像这样:

 $newBody = str_replace("\xE2\x80\x8C", "", $newBody);

但我也没有结果。 ZWSP没有被删除。

An example word in the text ($newBody) looks like this : ယူ​​က​​ရိန်
And I want to make it look like this : ယူကရိန်း

有什么想法吗? preg_replace会以某种方式更好地工作吗?

所以我尝试了

$newBody = preg_replace("/\xE2\x80\x8B/", "", $newBody);

它似乎是运作,但现在还有另一个问题。

<a class="defined" title="Ukraine">ယူ&#8203;က&#8203;ရိန်း</a>

转变为

<a class="defined _tt_t_" title="Ukraine" style="font-family: 'Masterpiece Uni Sans', TharLon, Myanmar3, Yunghkio, Padauk, Parabaik, 'WinUni Innwa', 'Win Uni Innwa', 'MyMyanmar Unicode', Panglong, 'Myanmar Sangam MN', 'Myanmar MN';">ယူကရိန်း</a>

我不希望它添加所有额外的东西。任何想法为什么会这样?除了想出一些方法只针对两者之间的文本,有没有另一种方法来阻止preg_replace添加所有这些额外的东西?顺便说一句,在Mac上使用谷歌浏览器。似乎与firefox有点不同......

1 个答案:

答案 0 :(得分:15)

此:

$newBody = str_replace("&#8203;", "", $newBody);

假设文本是HTML实体编码的。这样:

$newBody = str_replace("\xE2\x80\x8C", "", $newBody);
如果违规字符未编码但匹配错误字符(0xe2808c),则

应该有效。匹配与#8203相同的字符;你需要0xe2808b:

$newBody = str_replace("\xE2\x80\x8B", "", $newBody);