preg_split SKU分为几个部分

时间:2018-02-14 10:06:17

标签: php regex preg-split

我有很多需要拆分的SKU。我只需要字符串末尾的颜色和数字,这样就可以从分割中忽略第一个SKU-PRODUCT位。以下是SKU的一些示例:

SKU-PRODUCT-BLUE-1

SKU-PRODUCT-RED-1

SKU-PRODUCT-WHITE-1

SKU-PRODUCT-BABY-BLUE-1

我一直在使用preg_split('/-/', $sku),但它会将BABY-BLUE分成两部分。

有更好的方法吗?我不需要字符串的SKU-PRODUCT位,只需要颜色和最后的数字。仅列出拆分字符串中的每种颜色是否更好?

我的预期结果为['BLUE',1]['BABY-BLUE',1]

4 个答案:

答案 0 :(得分:0)

您可以使用

preg_match('~^[^-]+-[^-]+-(.+)-([^-]+)$~', $s, $matches)

请参阅this regex demo

<强>详情

  • ^ - 字符串开头
  • [^-]+- - 除-以外的一个或多个字符,然后-
  • [^-]+- - 与上述相同
  • (.+) - 第1组:尽可能多的1个字符
  • - - 连字符
  • ([^-]+) - 第2组:尽可能多的-以外的任何1个字符
  • $ - 字符串结束。

请参阅PHP demo

$strs = ['SKU-PRODUCT-BLUE-1', 'SKU-PRODUCT-RED-1', 'SKU-PRODUCT-WHITE-1', 'SKU-PRODUCT-BABY-BLUE-1'];
foreach ($strs as $s) {
    if (preg_match('~^[^-]+-[^-]+-(.+)-([^-]+)$~', $s, $matches)) {
            print_r(array($matches[1], $matches[2]));
            echo "\n";
    } else {
        echo "No match!";
    }
}

结果:

Array ( [0] => BLUE [1] => 1 )
Array ( [0] => RED [1] => 1 )
Array ( [0] => WHITE [1] => 1 )
Array ( [0] => BABY-BLUE [1] => 1 )

答案 1 :(得分:0)

我会用:

preg_match('/^SKU-(?:[^-]+)-(.*)-(\d+)$/', $input, $matches);

其中$input包含您要拆分的SKU(f.e。'SKU-PRODUCT-BLUE-1')。

成功时(preg_match()返回TRUE时),$matches[1]包含颜色,$matches[2]包含最后的数字。

答案 2 :(得分:-1)

假设Cb不是固定值而不能包含连字符( - ),颜色是一个包含连字符和事实上,这个数字只是一个数字。

由于您未在特定模式上拆分字符串,无法使用SKU来实现您想要的效果 - 它是工作的错误工具。您需要匹配模式上的整个字符串,并从生成的PRODUCT数组中提取所需的部分。

使用此RegEx:

preg_split

匹配任何非连字符,后跟0 | 1连字符恰好两次(例如 SKU-PRODUCT )后跟连字符,然后是任意字符(颜色),另一个连字符和任意数字的数字。

所以,在PHP中:

$matches

这导致:

^(?:[^-]+-?){2}-(.*)-([0-9]+)$

您的颜色和数字分别与第1组和第2组匹配。

答案 3 :(得分:-2)

不要使用正则表达式,请执行以下操作:

$a = explode('-', $product)
$_sku = array_shift($a);
$_product = array_shift($a);
$remainder = implode('-', $a);

如果SKUPRODUCT没有任何破折号,这将有效。

演出时间不会成为问题。

你也可以这样做:

preg_match('/[^-]+-[^-]+(.+)/', $product, $m);
$remainder = $m[1];