破折号和下划线的preg_match的奇怪行为

时间:2014-04-30 09:18:07

标签: php regex preg-match

我有两个表达方式。两者几乎相同,首先我检查以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] => _
)

问题是,第一个显示所有三个匹配的短划线,第二个显示只有一个下划线匹配。为什么?这种奇怪行为的逻辑/发生是什么?

2 个答案:

答案 0 :(得分:4)

在US-ASCII(以及大多数派生编码)中,[A-z]范围包括_但不包括-

echo implode('', range('A', 'z'));
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz

我认为这是一个错字,你的意思是:

'/[a-z0-9]+(-+)$/i'

答案 1 :(得分:2)

我不完全理解为什么会修复它,但这是因为你有A-z,而不是A-Z,所以:

$str= preg_match("/[a-zA-Z0-9]+(_+)$/",$str,$matches); //note uppercase Z

我只能假设在确定A-z(小写字母Z)之间的所有字符时,它似乎包含下划线,一个字母数字字符。