在PHP中使用lookback拆分字符串

时间:2014-08-07 19:17:03

标签: php regex

我有一个产品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

但我现在的问题是"如何在选项名称之前插入管道,除非它只有一个选项,或第一个选项"。我想我需要使用某种回顾,但我不知道。

2 个答案:

答案 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

Demo

答案 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

Here's a quick demo

注意:我假设数字总是被花括号或括号括起来,两者之间没有任何间距,数量名称只是字母字符(从不是数字)。