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);
如果SKU
和PRODUCT
没有任何破折号,这将有效。
表演时间在这里不是问题。
你也可以这样做:
preg_match('/[^-]+-[^-]+(.+)/', $product, $m);
$remainder = $m[1];
假设 SKU
和 PRODUCT
不是固定值,但 不能 包含连字符 (-),颜色是字母字符串它可以包含连字符,并且该数字实际上只是一个数字。
由于您没有按照 特定的 模式拆分字符串,因此您 不能 使用 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 组匹配。
我有一些 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);
如果SKU
和PRODUCT
没有任何破折号,这将有效。
表演时间在这里不是问题。
你也可以这样做:
preg_match('/[^-]+-[^-]+(.+)/', $product, $m);
$remainder = $m[1];
假设 SKU
和 PRODUCT
不是固定值,但 不能 包含连字符 (-),颜色是字母字符串它可以包含连字符,并且该数字实际上只是一个数字。
由于您没有按照 特定的 模式拆分字符串,因此您 不能 使用 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 组匹配。