正则/^[a-z]+$/只有 PHP 匹配换行符,这算是 PHP 的 bug 么

2019-06-21 09:21:52 +08:00
 alex8
# php 7.2.16
var_dump(preg_match("/^[a-z]+$/", "abc\n"));
#int(1)
 # javascript
var reg = /^[a-z]+$/;
console.log(reg.test("abc\n"));
# 打印的是 false
# java(jdk11)
System.out.println(Pattern.matches("^[a-z]+$", "abc\n"));
# 打印的是 false
4435 次点击
所在节点    PHP
33 条回复
yuwangG
2019-06-21 09:34:04 +08:00
你对比的不是一个东西, 你把 var_dump(preg_match("/^[a-z]+$/", "abc\n"));
#int(1)
yuwangG
2019-06-21 09:35:24 +08:00
换成 var_dump(preg_match("/^[a-z]+$/", 'abc\n')); 就会输出 #int(0)。 注意 PHP 双引号和单引号区别
no1xsyzy
2019-06-21 09:35:54 +08:00
没自己用过 PHP,但我合理猜测是 $ 匹配到了 \n 的前面
no1xsyzy
2019-06-21 09:36:34 +08:00
自己->仔细
no1xsyzy
2019-06-21 09:37:54 +08:00
@yuwangG 你在说什么鬼,1 分钟的搜索引擎告诉我单引号下 \n 不是换行符。
back0893
2019-06-21 09:42:01 +08:00
@no1xsyzy php 里面还真不是 使用单引号那么就是 \n 的字符串
Youngxj
2019-06-21 09:42:51 +08:00
var_dump(preg_match("/^[a-z]+$/", 'abc\n'));
输出的确实为 int(0),应该是 php 的双引号会把\n 解析掉,单引号是文本,所以不会解析掉
ben1024
2019-06-21 09:46:18 +08:00
单双引号
$str = 'abc';
var_dump(preg_match("/^[a-z]+$/", "{$str}\n"));
int 1

var_dump(preg_match("/^[a-z]+$/", 'abc\n'));
int 0
alex8
2019-06-21 09:47:33 +08:00
@yuwangG
请先了解 PHP 单引号和双引号的区别
SakuraKuma
2019-06-21 09:51:25 +08:00
我寻思着一楼有啥问题??
你把 match 出来的东西看看不就知道了。。
golden0125
2019-06-21 09:51:39 +08:00
@no1xsyzy 麻烦质疑前先自己测试一下
no1xsyzy
2019-06-21 09:57:32 +08:00
@back0893 https://tio.run/##K8go@P/fxr4go4CroCgzr0RBPTEpOSZP3RrKVbKyUoKzwVJKqFL2dv//AwA
请?
'abc\n' 是一个五字符的串,对应 list 是 '(#\a #\b #\c #\\ #\n) 或者说 '(97 98 99 92 110)
"abc\n" 是一个四字符的串,对应 list 是 '(#\a #\b #\c #\newline) 或者说 '(97 98 99 10)
no1xsyzy
2019-06-21 09:58:40 +08:00
@golden0125 您测试了?见 #12。
wu1990
2019-06-21 09:59:10 +08:00
/(*CRLF)^[a-z]+$/
no1xsyzy
2019-06-21 09:59:54 +08:00
ThirdFlame
2019-06-21 10:03:21 +08:00
是的 php 的 preg_match 中$ 可以命中字符串结尾 也可以命中 chr(10) , CTF 比赛经常会出现这个。
golden0125
2019-06-21 10:04:32 +08:00
@no1xsyzy PHP 初学者都知道的问题,双引号下\n 被转义了,单引号不会被转义,有这么难理解吗?
no1xsyzy
2019-06-21 10:08:27 +08:00
@wu1990 这个方法……是把换行符设置成 \r\n 才算吗?
leo108
2019-06-21 10:08:32 +08:00
@golden0125 建议看明白楼主的问题之后再来杠
no1xsyzy
2019-06-21 10:09:43 +08:00
@golden0125 我说的不是这个?
#5
> 单引号下 \n 不是换行符

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/576068

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX