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 是完整匹配)
处理多种分隔符或动态边界
如果左右分隔符不同,比如提取 " 中的 content:
$str = "<div>content</div>";
if (preg_match('/<div>(.*?)/', $str, $matches)) {
echo $matches[1]; // 输出:content
}<p>注意:<code></code></p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站"><img
src="https://img.php.cn/upload/skill/000/000/081/179040786932301.jpg" alt="btpanel phpsite 宝塔面板PHP网站" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="overflowclass">btpanel phpsite 宝塔面板PHP网站</a>
<p class="overflowclass">宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理</p>
</div>
<a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
</div> 中的 <code>/</code> 不需要转义(只有在使用 <code>/</code> 作定界符时才需转义斜杠),但为清晰可加反斜杠:<code></code>。<p>若分隔符含正则元字符(如 <code>.</code>、<code>*</code>、<code>+</code>、<code>?</code>、<code>^</code>、<code>$</code> 等),必须用 <code>preg_quote($delimiter, '/')</code> 转义:</p><pre class="brush:php;toolbar:false;">$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'
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










