PHP preg_match 在自己的电脑上不工作

PHP preg_match on own computer doesn't work

我有这个代码:

$success = preg_match('/(.+(駅前)?駅) (\(([^線]+線)\) )?((([^線 ]+) )?(\d+[分時])?)/u', $m, $matches);

示例输入文本是

大正駅 (JR大阪環状線) バス 20分

此正则表达式适用于 https://regex101.com/ and the code works on http://sandbox.onlinephpfunctions.com/。但是,当我在自己的计算机上 运行 PHP 代码时,它永远不会给我匹配。 $matches 是一个空数组,$success 是 0。是的,完全相同的代码。我已经验证正则表达式是正确的(使用第一个 link)并且代码本身有效(使用第二个 link)。但是,它仍然拒绝在我自己的 PC 上运行。

OS 是 Arch Linux, 运行ning PHP 7.3.11,系统语言环境是 ja_JP.UTF-8(我不认为很重要,但以防万一)

有人看到代码有什么问题吗?

所以我找到了问题。

首先,我在我的 PC 上尝试了 Nick (3v4l.org/o4ADM) 评论的单行,它有效。 (当然应该了。PHP不能破解。)

所以我发现我正在提供的数据 preg_match 应该被破坏。

正常的prints和echos是徒劳的--$m总是应该的。然后我考虑了AD7six的评论,

Check that the bytes for 駅 etc. are actually the same

所以我仔细看了看,字符都是日文,没有中文变体。而且全是日文,还好。

那会是什么呢?

我尝试使用 PHP 的 file_put_contents 将变量转储到一个文件,然后用我的日文键盘手动输入相同的文本并将它们保存到另一个文件。我打开 Meld(一个 diff 工具)并比较了两个文本,瞧——文本上的 spaces 使用与通常的半角 space (0x20) 不同的代码点。它改用 0xA0,显然是 "no-break space"。搞什么。

幸运的是,一个简单的 $m = str_replace("\u{00A0}", " ", $m) 就成功了。

感谢大家引导我找到正确答案!