PHP中截取两字符间内容最常用正则表达式,用preg_match()配合非贪婪捕获组(.?)并转义特殊分隔符,如/[(.?)]/提取中括号内内容,注意s修饰符支持换行、u修饰符支持UTF-8。

PHP中截取两个字符之间的内容,最常用且灵活的方式是用正则表达式配合 preg_match() 或 preg_match_all()。核心思路是:用捕获组 (...) 匹配两个界定符之间的内容,注意转义特殊字符、控制贪婪/非贪婪匹配。
基础写法:匹配一对固定分隔符之间的内容
比如从字符串 "start[hello]end" 中提取 hello,中括号是分隔符:
$str = "start[hello]end";
if (preg_match('/\[(.*?)\]/', $str, $matches)) {
echo $matches[1]; // 输出:hello
}
说明:
-
\[和\]是对中括号的转义(它们在正则中有特殊含义) -
(.*?)是非贪婪捕获组:.匹配任意字符(除换行),*?表示“尽可能少匹配”,避免跨多组误截 -
$matches[1]是第一个捕获组的内容(索引 0 是完整匹配)
处理多种分隔符或动态边界
如果左右分隔符不同,比如提取 "<div>content</div>" 中的 content:
立即学习“PHP免费学习笔记(深入)”;
$str = "<div>content</div>";
if (preg_match('/<div>(.*?)<\/div>/', $str, $matches)) {
echo $matches[1]; // 输出:content
}
注意: 中的 / 不需要转义(只有在使用 / 作定界符时才需转义斜杠),但为清晰可加反斜杠:。
若分隔符含正则元字符(如 .、*、+、?、^、$ 等),必须用 preg_quote($delimiter, '/') 转义:
$left = "[";
$right = "]";
$pattern = '/' . preg_quote($left, '/') . '(.*?)' . preg_quote($right, '/') . '/';
if (preg_match($pattern, $str, $matches)) {
echo $matches[1];
}
提取所有匹配项(不止第一个)
用 preg_match_all() 获取全部中间内容:
$str = "a[one]b[two]c[three]";
preg_match_all('/\[(.*?)\]/', $str, $matches);
print_r($matches[1]); // 输出:Array ( [0] => one [1] => two [2] => three )
注意事项和常见坑
避免以下典型问题:
- 忘记非贪婪
?:写成/(.*)/会导致从第一个左界匹配到最后一个右界,中间全吞掉 - 没转义分隔符:如匹配
"price: $19.99"中的数字,$和.必须转义:/\$([0-9.]+)/ - 未考虑换行:默认
.不匹配换行符,如需跨行,加s修饰符:'/start(.*?)end/s' - 中文或 Unicode 字符:确保字符串是 UTF-8 编码,并在正则后加
u修饰符,如'/\[(.*?)\]/u'



















