删除Unicode零宽度空间PHP

Jim*_*ong 8 php unicode str-replace

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

首先我尝试使用:

  $newBody = str_replace("​", "", $newBody);
Run Code Online (Sandbox Code Playgroud)

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

  $newBody = str_replace("&#8203", "", $newBody);
Run Code Online (Sandbox Code Playgroud)

得到相同没有结果.

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

看起来像这样:

 $newBody = str_replace("\xE2\x80\x8C", "", $newBody);
Run Code Online (Sandbox Code Playgroud)

但我也没有结果.ZWSP未被删除.

An example word in the text ($newBody) looks like this : ???​??​????
And I want to make it look like this : ????????
Run Code Online (Sandbox Code Playgroud)

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

所以我试过了

$newBody = preg_replace("/\xE2\x80\x8B/", "", $newBody);
Run Code Online (Sandbox Code Playgroud)

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

<a class="defined" title="Ukraine">??&#8203;?&#8203;?????</a>
Run Code Online (Sandbox Code Playgroud)

变成了

<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>
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*Jef 16

这个:

$newBody = str_replace("&#8203;", "", $newBody);
Run Code Online (Sandbox Code Playgroud)

假设文本是HTML实体编码的.这个:

$newBody = str_replace("\xE2\x80\x8C", "", $newBody);
Run Code Online (Sandbox Code Playgroud)

如果违规字符未编码但匹配错误的字符(0xe2808c),则应该有效.匹配与#8203相同的字符; 你需要0xe2808b:

$newBody = str_replace("\xE2\x80\x8B", "", $newBody);
Run Code Online (Sandbox Code Playgroud)

  • 所以,这似乎没有用,但我确实尝试了$ newBody = preg_replace("/\xE2\x80\x8B /","",$ newBody); 它确实有效. (2认同)
  • html实体编码的字符串(&#8203;)我可以在浏览器中看到.这个未编码的例子我只能看到我将你的例子粘贴到vi(Linux/Unix中常用的文本编辑器)中,它显示为"<200b>"(十六进制的UTF-16表示) - 尽管这是依赖的我的vi是如何设置的.了解字符集问题的一个很好的起点是:http://www.joelonsoftware.com/articles/Unicode.html (2认同)

Tot*_*oto 8

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

$string = preg_replace('/[\x{200B}-\x{200D}\x{FEFF}]/u', '', $string);
Run Code Online (Sandbox Code Playgroud)

参考: