首页 > 解决方案 > PHP preg_match 在自己的计算机上不起作用

问题描述

我有这个代码:

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

示例输入文本是

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

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

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

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

标签: phpregexpreg-match

解决方案


所以我能够找到问题所在。

首先,我在我的 PC 上尝试了 Nick (3v4l.org/o4ADM) 评论的单行代码,它可以工作。(当然应该。PHP 不能被破坏。)

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

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

检查駅等的字节实际上是否相同

所以我仔细检查了字符都是日文,没有中文变体。而且都是日文,没问题。

那会是什么?

我尝试使用 PHPfile_put_contents将变量转储到文件中,然后用我的日语键盘手动输入相同的文本并将它们保存到另一个文件中。我打开 Meld(一个差异工具)并比较了两个文本,瞧——文本上的空格使用的代码点与通常的半角空格 (0x20) 不同。它使用 0xA0 代替,显然这是一个“不间断空间”。有没有搞错。

幸运的是,一个简单$m = str_replace("\u{00A0}", " ", $m)的伎俩。

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


推荐阅读