使用PHP正则表达式清理存在部分重复格式的长字符串
解决PHP正则清理重复
/__text后缀的问题 看起来你需要清理字符串里重复出现的/__text后缀,同时保留原有的字段层级结构。这里有几个实用的正则方案,你可以根据具体需求选择:
基础方案:直接移除所有/__text后缀
如果你的核心需求就是去掉所有冗余的/__text,让字符串回归简洁的字段列表,用这个最简单的正则就能搞定:
$originalString = "Name/__text,Password/__text,Profile/__text,Locale/__text,UserType/__text,PasswordUpdateDate/__text,Columns/0/Name/__text,Columns/0/Label/__text,Columns/0/Order/__text,Columns/1/Name/__text,Columns/1/Label/__text,Columns/1/Order/__text,Columns/2/Name/__text,Columns/2/Label/__text,Columns/2/Order/__text,Columns/3/Name/__text,Columns/3/Label/__text,Columns/3/Order/__text,Columns/4/Name/__text,Columns/4/Label/__text,Columns/4/Order..."; // 全局替换所有/__text为空字符串 $cleanedString = preg_replace('/\/__text/', '', $originalString); echo $cleanedString;
这个正则/\/__text/会精准匹配目标后缀,PHP的preg_replace默认会全局替换所有匹配项,不需要额外加修饰符。
进阶严谨方案:仅替换字段末尾的/__text
如果担心字符串中间可能意外出现/__text(虽然你的例子里没有,但做严谨性处理很有必要),可以用锚定匹配的正则,确保只替换字段结尾的目标内容:
// 匹配/__text后面跟着逗号或字符串结尾的情况,替换成对应的分隔符或空 $cleanedString = preg_replace('/\/__text(,|$)/', '$1', $originalString);
这个正则会把Name/__text,转换成Name,,把最后一个字段的/__text直接删掉,完全保留原有的分隔结构。
额外扩展:把Columns结构转成结构化数据
如果你的需求不止是清理后缀,还想把重复的Columns条目整理成更易操作的结构化格式(比如JSON数组),可以搭配字符串拆分和数组处理:
// 第一步先清理后缀 $cleanedFields = preg_replace('/\/__text/', '', $originalString); // 拆分字段成数组 $fieldArray = explode(',', $cleanedFields); $columnsData = []; foreach ($fieldArray as $field) { if (str_starts_with($field, 'Columns/')) { // 拆分Columns的层级路径 [, $columnIndex, $keyName] = explode('/', $field); if (!isset($columnsData[$columnIndex])) { $columnsData[$columnIndex] = []; } $columnsData[$columnIndex][$keyName] = ''; // 这里可以根据需求设置默认值 } } // 转成格式化的JSON输出 echo json_encode($columnsData, JSON_PRETTY_PRINT);
处理后Columns部分会变成清晰的键值对数组,后续做业务处理会方便很多。
内容的提问来源于stack exchange,提问作者Michele
相关产品推荐
相关产品推荐

