preg_split SKU 分成部分

preg_split SKU into sections

我有一些 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]

您可以使用

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

参见 this regex demo

详情

  • ^ - 字符串开头
  • [^-]+- - - 以外的 1 个或多个字符,然后是 -
  • [^-]+- - 同上
  • (.+) - 第 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 )

我会使用:

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

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

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

不要使用正则表达式,这样做:

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

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

表演时间在这里不是问题。

你也可以这样做:

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

假设 SKUPRODUCT 不是固定值,但 不能 包含连字符 (-),颜色是字母字符串它可以包含连字符,并且该数字实际上只是一个数字。

由于您没有按照 特定的 模式拆分字符串,因此您 不能 使用 preg_split 来实现您想要的- 这是错误的工作工具。您将需要匹配模式中的整个字符串,并从生成的 $matches 数组中提取您需要的那些部分。

使用这个正则表达式:

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

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

所以,在 PHP:

<?php
header('Content-Type: text/plain;charset=utf-8');

$skus = [
    'SKU-PRODUCT-BLUE-1',
    'SKU-PRODUCT-RED-1',
    'SKU-PRODUCT-WHITE-1',
    'SKU-PRODUCT-BABY-BLUE-1'
];

foreach($skus as $sku) {
    $matches = null;
    preg_match('/^(?:[^-]+-?){2}-(.*)-([0-9]+)$/', $sku, $matches);
    print_r($matches);
}

这导致:

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

您的颜色和号码分别与第 1 组和第 2 组匹配。