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

标签 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] => _
)

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

最佳答案

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

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

我想这是一个打字错误,你的意思是:

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

关于php - 破折号和下划线的 preg_match 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23384202/

相关文章:

php正则表达式匹配数字后的单个字母

php - 将字符串的第一个字母大写(前面有特殊字符)- PHP

php - 将大于 1MB/iOS 的文件上传到服务器

php - Laravel如何编写具有多个条件但记录在同一用户下的搜索查询

javascript - 逗号分隔的电话号码验证

php - 将字符串部分与数组值进行比较

php - 是什么原因导致警告: preg_match(): Unknown modifier 'p'

php - 如何在 Windows 服务器上使用 phpdbg 获得 PHP 代码覆盖率?

php - 无重复日期

java - Struts 2中tuckey出站规则中&amp的使用方法