# 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
1
yuwangG 2019-06-21 09:34:04 +08:00
你对比的不是一个东西, 你把 var_dump(preg_match("/^[a-z]+$/", "abc\n"));
#int(1) |
2
yuwangG 2019-06-21 09:35:24 +08:00
换成 var_dump(preg_match("/^[a-z]+$/", 'abc\n')); 就会输出 #int(0)。 注意 PHP 双引号和单引号区别
|
3
no1xsyzy 2019-06-21 09:35:54 +08:00 1
没自己用过 PHP,但我合理猜测是 $ 匹配到了 \n 的前面
|
4
no1xsyzy 2019-06-21 09:36:34 +08:00
自己->仔细
|
7
Youngxj 2019-06-21 09:42:51 +08:00
var_dump(preg_match("/^[a-z]+$/", 'abc\n'));
输出的确实为 int(0),应该是 php 的双引号会把\n 解析掉,单引号是文本,所以不会解析掉 |
8
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 |
10
SakuraKuma 2019-06-21 09:51:25 +08:00
我寻思着一楼有啥问题??
你把 match 出来的东西看看不就知道了。。 |
11
golden0125 2019-06-21 09:51:39 +08:00
@no1xsyzy 麻烦质疑前先自己测试一下
|
12
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) |
13
no1xsyzy 2019-06-21 09:58:40 +08:00
@golden0125 您测试了?见 #12。
|
14
wu1990 2019-06-21 09:59:10 +08:00
/(*CRLF)^[a-z]+$/
|
15
no1xsyzy 2019-06-21 09:59:54 +08:00
|
16
ThirdFlame 2019-06-21 10:03:21 +08:00
是的 php 的 preg_match 中$ 可以命中字符串结尾 也可以命中 chr(10) , CTF 比赛经常会出现这个。
|
17
golden0125 2019-06-21 10:04:32 +08:00
@no1xsyzy PHP 初学者都知道的问题,双引号下\n 被转义了,单引号不会被转义,有这么难理解吗?
|
19
leo108 2019-06-21 10:08:32 +08:00
@golden0125 建议看明白楼主的问题之后再来杠
|
20
no1xsyzy 2019-06-21 10:09:43 +08:00
|
21
zsdroid 2019-06-21 10:12:16 +08:00 5
/^[a-z]+$/D
php 正则用的是 Perl 兼容正则表达式 $ 结尾处默认忽略回车 加 D 就变成不忽略回车 |
22
golden0125 2019-06-21 10:15:26 +08:00
|
23
alex8 OP |
24
golden0125 2019-06-21 10:16:00 +08:00
@leo108 麻烦你看明白我的问题后再来杠
|
25
no1xsyzy 2019-06-21 10:18:48 +08:00 1
对了回到楼主的问题,看来不是 bug 是 feature ……
PCRE 这套正则就是这么设计的,as spec。参考:<https://php.net/manual/zh/reference.pcre.pattern.modifiers.php> 『默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), "行首"元字符 (^) 仅匹配字符串的开始位置, 而"行末"元字符 ($) 仅匹配字符串末尾, 或者最后的换行符(除非设置了 D 修饰符)。』 所以正确的做法是加修饰符 D,样例: https://tio.run/##K8go@P/fxr4go4CroCgzr0ShLLEoPqU0t0CjoCg1PT43sSQ5Q0NJPy46UbcqVltFX0lHQSkxKVlJU9OaOA0uUB0xeWA99nb//wMA |
26
no1xsyzy 2019-06-21 10:20:28 +08:00
@golden0125 看楼主标题 “只有 PHP 匹配换行符”。
而 #1#2 答非所问,要问个换行符相关的问题,结果回答是 “把换行符去掉就行了”。你觉得这是回答? |
28
golden0125 2019-06-21 10:26:01 +08:00
@no1xsyzy 我没看到他回答过 “把换行符去掉就行了” 他回答的很清楚,注意单双引号的区别
|
31
no1xsyzy 2019-06-21 10:36:31 +08:00
@golden0125 把 "\n" 换成 '\n' 不是把换行符去掉?换成了 #\\ 和 #\n。
你说说 'abc\n' 里哪来的换行符?换成单引号哪里符合楼主的提问? 况且那个 "abc\n" 实际使用基本不会是字面量而是字符串变量( Pattern 是变量而待匹配字符串是常量的情况比较少,而且这种情况一般也不会产生换行结尾的),这种情况下你怎么改单引号? 没理了还强行杠? |
32
dyllen 2019-06-21 13:53:00 +08:00
@sunweiqiang8 不是独有吧,php 的文档里面明确说明的 php 实现的正则是和 perl 一样的,那估计 perl 里面也是这样的。
|