Php preg_将SKU拆分为多个部分

Php preg_将SKU拆分为多个部分,php,regex,preg-split,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,但它会将浅蓝色分成两部分 有更好的方法吗?我不需要字符串的SKU-PRODUCT位,只需要末尾的颜色和数字。只列出分割字符串中的每种颜色是否更好 我的

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

SKU-PRODUCT-BLUE-1

SKU-PRODUCT-RED-1

SKU-PRODUCT-WHITE-1

SKU-PRODUCT-BABY-BLUE-1

我一直在使用preg_split'/-/',$sku,但它会将浅蓝色分成两部分

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

我的预期结果是['BLUE',1]或['BABY-BLUE',1]。

您可以使用

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

细节

^-字符串的开头 [^-]+--1个或多个字符,而不是-然后- [^-]+--同上 .+-第1组:尽可能多的任何1+字符 --连字符 [^-]+-2组:除-尽可能多的字符以外的任何1+字符 $-字符串的结尾。 见:

结果:

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,即“SKU-PRODUCT-BLUE-1”


如果返回TRUE,则成功,$matches[1]包含颜色,$matches[2]包含结尾的数字。

不要使用regexp,请执行以下操作:

$a = explode('-', $product)
$_sku = array_shift($a);
$_product = array_shift($a);
$remainder = implode('-', $a);
如果SKU和产品没有任何破折号,这将是有效的

性能时间在这里不是问题

你也可以这样做:

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

假设SKU和PRODUCT不是固定值,但不能包含连字符-,则颜色是可以包含连字符的alpha字符串,并且数字实际上只是一个数字

由于您没有按照特定的模式分割字符串,因此无法使用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);
}

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

谢谢您的快速回复。它看起来像是将BABY-BLUE拆分为两个单词,我正在尝试将其保留为BABY-BLUE,这可能吗?我的预期结果是['BLUE',1]或['BABY-BLUE',1],在您的示例中,它将其拆分为产品BABYYes,它只会为每个值返回['SKU-PRODUCT',]me@Callum不能使用preg_split,因为不需要字符串的一部分。当您需要分割字符串的所有位时,您必须使用匹配而不是分割,这很好。谢谢您的帮助。我不知道是谁投了反对票,但我只是把它标记为一个答案。Cheer不确定是否要保存SKU-PRODUCT部件,但这应该可以做到:^?:[^-]+-?{2}-.-[0-9]+$-@CD001您好,我在尝试时遇到了一个错误:未知修饰符“-”。可能是因为我刚刚编写了模式-不包括分隔符。这只给出了两个空字符串
<?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
)