我有以下两个表达式。两者几乎相同,第一次我检查以3个破折号结尾的字符串,第二次检查以3条下划线结尾的字符串
$str="this-is_normal-test---";
$str= preg_match("/[a-zA-z0-9]+(-+)$/",$str,$matches);
print_r($matches);
$str="this-is_normal-test___";
$str= preg_match("/[a-zA-z0-9]+(_+)$/",$str,$matches);
print_r($matches);
这是输出:
Array
(
[0] => test---
[1] => ---
)
Array
(
[0] => test___
[1] => _
)
问题是,第一个显示了所有三个匹配的破折号,而第二个只显示了一个匹配的下划线。为什么?这种奇怪行为的逻辑是什么?
在US-ASCII(以及大多数派生编码(中,[A-z]
范围包括_
,但不包括-
:
echo implode('', range('A', 'z'));
ABCDEFGHIJKLMNOPQRSTUVWXYZ[']^_`abcdefghijklmnopqrstuvwxyz
我想这是一个打字错误,你的意思是:
'/[a-z0-9]+(-+)$/i'
我不完全理解为什么要修复它,但这是因为你有A-z
,而不是A-Z
,所以:
$str= preg_match("/[a-zA-Z0-9]+(_+)$/",$str,$matches); //note uppercase Z
我只能假设,在确定A-z
(小写Z(之间的所有字符时,它似乎包括下划线,一个字母数字字符。