删除或匹配Unicode零宽度空间PHP


Remove or match a Unicode Zero Width Space PHP

我有一个缅甸语UTF-8文本。我使用PHP与文本工作。在这个过程中的某个时刻,一些zwsp已经悄悄进入,我想删除它们。我尝试了两种不同的方法来删除字符,但似乎都不起作用。

首先我尝试使用:

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

来搜索HTML实体并删除它,因为这是它在Web Inspector下的显示方式。空格不会被移走。我也试过:

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

并得到相同的no结果

我尝试的第二种方法是在这个问题上发现从PHP中的字符串中删除ZERO WIDTH NON-JOINER字符

看起来像这样:

 $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上使用google chrome浏览器。它的行为似乎与firefox有点不同…

This:

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

假定文本是HTML实体编码。:

$newBody = str_replace("'xE2'x80'x8C", "", $newBody);
如果有问题的字符没有编码,但匹配错误的字符(0xe2808c),

应该工作。匹配#8203;你需要0xe2808b:

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

如果要从UTF-8字符串中删除零宽度空格字符:

$string = preg_replace('/['x{200B}-'x{200D}'x{FEFF}]/u', '', $string);

引用:

  • https://gist.github.com/ahmadazimi/b1f1b8f626d73728f7aa (php)
  • 从JavaScript字符串(js)中删除零宽度空格字符