如何高效去除字符串中花括号外部的可变无关文本?
最佳修剪花括号外部文本的方法
嘿,这个需求挺常见的,我给你分享几个实用的解决方案,都是针对你给出的PHP场景的:
方法一:正则表达式(最简洁)
因为你只需要保留花括号及其内部的内容,不管前后的文本是什么,用正则匹配是最直接的方式。这里我们可以用preg_match函数来提取目标内容:
保留花括号及其内部内容
$myString = "10:0{ 'name':'John', 'age':30, 'car':null }24:0"; // 正则匹配从第一个{到最后一个}的所有内容,s修饰符允许匹配换行符 preg_match('/{.*}/s', $myString, $matches); // 三元运算符处理没有匹配到的情况,避免报错 $trimmedString = $matches[0] ?? ''; echo $trimmedString; // 输出: { 'name':'John', 'age':30, 'car':null }
只保留花括号内部的内容(去掉花括号)
如果你的需求是去掉外部文本的同时也去掉花括号,只留里面的内容,可以稍微调整正则:
preg_match('/{(.*)}/s', $myString, $matches); $innerContent = $matches[1] ?? ''; echo $innerContent; // 输出: 'name':'John', 'age':30, 'car':null
方法二:字符串位置截取(更直观,适合无嵌套花括号场景)
如果你担心正则的复杂度,或者确定字符串里只有一对花括号,可以用字符串定位函数来手动截取:
$myString = "10:0{ 'name':'John', 'age':30, 'car':null }24:0"; // 找到第一个左花括号的位置 $startPos = strpos($myString, '{'); // 找到最后一个右花括号的位置 $endPos = strrpos($myString, '}'); // 先判断是否找到有效的花括号对 if ($startPos !== false && $endPos !== false && $endPos > $startPos) { // 从左花括号位置开始,截取到右花括号结束(包含右花括号) $trimmedString = substr($myString, $startPos, $endPos - $startPos + 1); echo $trimmedString; // 输出预期内容 } else { // 处理没有找到有效花括号的异常情况 echo "未在字符串中找到有效的花括号对"; }
注意事项
- 如果你的字符串里存在嵌套花括号(比如
{ {a:1} b:2 }),上面的基础正则会失效,这时候需要用递归正则:/{(?:[^{}]|(?R))*}/s,不过这种场景在你的示例里应该不会出现,先记住基础用法就好。 - 两种方法都能处理外部文本任意变化的情况,完全不用关心前后的内容是什么,只要花括号存在就能准确提取。
内容的提问来源于stack exchange,提问作者iancarp
相关产品推荐
相关产品推荐

