我有很多需要拆分的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]
。
答案 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)
假设C
和b
不是固定值而不能包含连字符( - ),颜色是一个包含连字符和事实上,这个数字只是一个数字。
由于您未在特定模式上拆分字符串,无法使用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);
如果SKU
和PRODUCT
没有任何破折号,这将有效。
演出时间不会成为问题。
你也可以这样做:
preg_match('/[^-]+-[^-]+(.+)/', $product, $m);
$remainder = $m[1];