本机上的PHP preg_match不起作用

时间:2019-11-18 09:27:05

标签: php regex preg-match

我有此代码:

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

示例输入文本为

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

所以我发现应该破坏的是我正在馈送的数据preg_match

正常的printecho是徒劳的,$m总是这样。然后我考虑了AD7six的评论,

  

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

所以我仔细检查以确保所有字符都是日语,并且没有中文变体。而且都是日语,没关系。

那会是什么?

我尝试使用PHP的file_put_contents将变量转储到文件中,然后使用日语键盘手动键入相同的文本并将其保存到另一个文件中。我打开了Meld(差异工具)并比较了两个文本和voila-文本上的空格使用的代码点不同于通常的半角空格(0x20)。显然,它使用的是0xA0,这是一个“不间断空间”。哎呀。

幸运的是,一个简单的$m = str_replace("\u{00A0}", " ", $m)就可以解决问题。

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

答案 1 :(得分:-1)

此:https://www.php.net/manual/en/function.preg-match.php

$re = '/(.+(駅前)?駅) (\(([^線]+線)\) )?((([^線 ]+) )?(\d+[分時])?)/m';
$str = '大正駅 (JR大阪環状線) バス 20分';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);