如何匹配编码为UTF8的ZWSP(零宽空间)

问题描述 投票:0回答:0

我在匹配编码为 UTF8 的 ZWSP unicode 时遇到了一些问题

ZWSP: \x20\x0B
ZWSP (UTF8): \xE2\x80\x8B

作为额外的测试用例,我使用了按预期工作的 NBSP(不间断空格)

所有

preg_replace
都是UTF8模式
/u

  • 匹配 NBSP 时,它按预期工作。输入编码为UTF8,输出为空(NBSP unicode替换为空字符串)

  • 当匹配 ZWSP 如果 ZWSP 输入是not UTF8 编码时才有效。

  • 如果将 ZWSP 模式更改为 UTF8 编码版本并保持输入为 UTF8,它也不起作用

Q:那在UTF8中如何匹配ZWSP?

...或者这是一个错误?

代码

$nbsp       = '\xA0'; // Non-breaking space
$zwsp       = '\x20\x0B'; // Zero-width space
$zwsp_utf8  = '\xE2\x80\x8B';

$input_nbsp_utf8    = "\xC2\xA0";
$input_zwsp         = "\x20\x0B";
$input_zwsp_utf8    = "\xE2\x80\x8B";

// NBSP
echo "NBSP\n-----\n";
echo "in: $input_nbsp_utf8--\nhex: ".bin2hex($input_nbsp_utf8)."\n";
$output = preg_replace('/'.$nbsp.'/u', '', $input_nbsp_utf8);
echo "out: $output--\nhex: ".bin2hex($output)."\n\n";

// ZWSP (input: **not** UTF8)
echo "ZWSP (input: **not** UTF8)\n-----\n";
echo "in: $input_zwsp--\nhex: ".bin2hex($input_zwsp)."\n";
$output = preg_replace('/'.$zwsp.'/u', '', $input_zwsp);
echo "out: $output--\nhex: ".bin2hex($output)."\n\n";

// ZWSP (input: UTF8)
echo "ZWSP (input: UTF8)\n-----\n";
echo "in: $input_zwsp_utf8--\nhex: ".bin2hex($input_zwsp_utf8)."\n";
$output = preg_replace('/'.$zwsp.'/u', '', $input_zwsp_utf8);
echo "out: $output--\nhex: ".bin2hex($output)."\n\n";

// ZWSP (pattern: UTF8, input: UTF8)
echo "ZWSP (pattern: UTF8, input: UTF8)\n-----\n";
echo "in: $input_zwsp_utf8--\nhex: ".bin2hex($input_zwsp_utf8)."\n";
$output = preg_replace('/'.$zwsp_utf8.'/u', '', $input_zwsp_utf8);
echo "out: $output--\nhex: ".bin2hex($output)."\n\n";

输出

NBSP
-----
in:  --
hex: c2a0
out: --
hex:

ZWSP (input: **not** UTF8)
-----
in:
     --
hex: 200b
out: --
hex:

ZWSP (input: UTF8)
-----
in: ​--
hex: e2808b
out: ​--
hex: e2808b // Output should be empty

ZWSP (pattern: UTF8, input: UTF8)
-----
in: ​--
hex: e2808b
out: ​--
hex: e2808b // Output should be empty
php regex utf-8 pcre
© www.soinside.com 2019 - 2024. All rights reserved.