我有一个产品Feed,产品选项的格式如下:
Color{1} : Black[14], White[42] Size{2} : Small[16], Medium[17], Large[18]
为了使我的脚本能够正确理解和解析产品选项,需要采用以下格式:
Color:Black,White|Size:Small,Medium,Large
我这样开始删除不必要的信息:
$matches[1] = preg_replace("/\{\d{1,}\} : /", ': ', $matches[1]);
$matches[1] = preg_replace("/\[\d{1,}\]/", '', $matches[1]);
这给出了这个输出:
Color: Black, White Size: Small, Medium, Large
但我现在的问题是"如何在选项名称之前插入管道,除非它只有一个选项,或第一个选项"。我想我需要使用某种回顾,但我不知道。
答案 0 :(得分:3)
首先,使用preg_split()
将字符串拆分为多个单独的选项:
$arr = preg_split('/\s+(?=[a-z]+{\d+})/i', $str);
(?=[a-z]+{\d+})
是一个积极的先行者,断言空格(\s+
)后跟一个格式为<string>{xx}
的字符串。这里用它来确定应该发生分裂的空间。重要的是要注意前瞻断言是零宽度,即它根本不消耗任何字符。
获得split数组后,循环遍历它,然后删除{xx}
,[xx]
部分和空格:
foreach ($arr as &$str)
$str = preg_replace('/(?:{\d+}|\[\d+\]|\s*)/', '', $str);
按|
加入数组:
echo join('|', $arr);
输出:
Color:Black,White|Size:Small,Medium,Large
答案 1 :(得分:0)
此方法仅使用两次正则表达式替换迭代
首先,删除所有空格和数字
$re = "/(.\\d+.|[ ]+)/";
$str = "Color{1} : Black[14], White[42] Size{2} : Small[16], Medium[17], Large[18]";
$subst = '';
$result = preg_replace($re, $subst, $str);
然后添加管道
$re = "/([a-z])([A-Z])/";
$subst = '\1|\2';
$endresult = preg_replace($re, $subst, $result);
输入:
Color{1} : Black[14], White[42] Size{2} : Small[16], Medium[17], Large[18]
输出:
Color:Black,White|Size:Small,Medium,Large
注意:我假设数字总是被花括号或括号括起来,两者之间没有任何间距,数量名称只是字母字符(从不是数字)。