php - 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(我认为这并不重要,但以防万一)
有人看到代码有什么问题吗?
解决方案
所以我能够找到问题所在。
首先,我在我的 PC 上尝试了 Nick (3v4l.org/o4ADM) 评论的单行代码,它可以工作。(当然应该。PHP 不能被破坏。)
所以我preg_match
发现应该破坏的是我提供的数据。
正常print
的 s 和echo
s 都是徒劳$m
的——总是应该的。然后我考虑了 AD7six 的评论,
检查駅等的字节实际上是否相同
所以我仔细检查了字符都是日文,没有中文变体。而且都是日文,没问题。
那会是什么?
我尝试使用 PHPfile_put_contents
将变量转储到文件中,然后用我的日语键盘手动输入相同的文本并将它们保存到另一个文件中。我打开 Meld(一个差异工具)并比较了两个文本,瞧——文本上的空格使用的代码点与通常的半角空格 (0x20) 不同。它使用 0xA0 代替,显然这是一个“不间断空间”。有没有搞错。
幸运的是,一个简单$m = str_replace("\u{00A0}", " ", $m)
的伎俩。
感谢大家引导我找到正确的答案!
推荐阅读
- java - 使用 JSON 和 volley 发送数据
- google-pagespeed - 灯塔:FAILED_DOCUMENT_REQUEST
- java - 我可以强制 maven 依赖项 A 使用特定版本的依赖项 B,同时使用不同版本的依赖项 B 吗?
- react-native - 具有相同动作的减速器影响多个屏幕
- robotframework - 如何在机器人框架中同时使用 And 和 Or 条件
- cakephp - cakephp:使用保存方法,我想在数据没有变化时更新修改时间
- css - Angular 在全局 style.css 文件中使用 CSS 变量
- go - Go 的 Echo 框架路由器问题?
- javascript - 在简单网站上显示生成的 JSON 文件
- neo4j - Cypher:如何优化浏览器中的搜索(可能使用参数)