Удалить Unicode Zero Width Space PHP

у меня есть текст на бирманском языке, UTF-8. Я использую PHP для работы с текстом. В какой-то момент по пути некоторые ZWSPs прокрались, и я хотел бы удалить их. Я пробовал два разных способа удаления символов, и ни один из них не работает.

сначала я попытался использовать:

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

для поиска HTML-сущности и ее удаления, как это выглядит в разделе веб-инспектор. Пробелы не удаляются. Я тоже пробовал as:

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

и получить тот же результат.

второй метод, который я пробовал, был найден по этому вопросу удалить символ нулевой ширины из строки в PHP

, который выглядел вот так:

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

но я также не получил никакого результата. ZWSP не был удален.

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

какие идеи? Может еще работать как-то лучше?

поэтому я попытался

$newBody = preg_replace("/xE2x80x8B/", "", $newBody);

и, похоже, это работает, но теперь возникает другая проблема.

<a class="defined" title="Ukraine">ယူ​က​ရိနး</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 всех этих дополнительных вещей? Кстати, используя google chrome на mac. Кажется, он действует немного по-другому с firefox...

1 ответов


Это:

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

предполагает, что текст закодирован HTML-сущностью. Это:

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

должно работать, если оскорбительные символы не закодированы, но соответствуют неправильному символу (0xe2808c). Чтобы соответствовать тому же символу, что и #8203; вам нужно 0xe2808b:

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