我有此代码:
$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(我认为这并不重要,但以防万一)
有人看到代码有什么问题吗?
答案 0 :(得分:1)
所以我能够找到问题所在。
首先,我在我的PC上尝试了Nick(3v4l.org/o4ADM)所说的单线,它可以工作。 (当然应该。PHP不能被破坏。)
所以我发现应该破坏的是我正在馈送的数据preg_match
。
正常的print
和echo
是徒劳的,$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);