php Regex根据一些特定规则正确识别标题中的SKU

mfpqipee  于 2023-02-07  发布在  PHP
关注(0)|答案(2)|浏览(115)

我有一堆产品名称,我需要从中提取其中的SKU。
所以以下面的标题为例:

  • 258权力的游戏
  • E457口袋妖怪
  • 293A羊毛床罩
  • 572 C钢框架(无论什么)

因此,在上述示例中,SKU分别为258E457293A572 C
一般来说,SKU或者是全数字(主要是3或4个字符长),或者是字母E后面再跟着3 - 4个数字,或者是3 - 4位数字后面跟着单个字母,或者是单个空格和单个字母。
因此,我想出了这个模式,似乎可以很好地识别上述所有情况:/^E?\d+ ?.?/
https://regex101.com/r/I7kkDP/2
然后,有一些完全混乱的标题,它们的SKU在中间的某个地方......据我所知,这种情况很少见,当它们发生时,只有数字,所以没有E开头,也没有单个字母结尾。下面是两个这样的例子:

  • 装饰枕头/带床罩的套装2456 55 X55cm
  • 枕头207 45 x 65厘米

幸运的是,在这些罕见的情况下,SKU是标题中遇到的第一个整数。
所以,我需要的是preg_replace来修复上面完全混乱的标题,这样我的模式就可以正确地提取SKU。
先谢谢你了。

brgchamk

brgchamk1#

使用单词边界(\b)将SKU与任何其他字符区分开来,然后检查您的定义字符。
边界将确保您不会错误地将258 G258 Game of Thrones匹配。

$rx = '/\bE?\d{3,}( ?[A-Z])?\b/';
if (preg_match($rx, $title, $matches)) {
    [ $sku ] = $matches;
}

https://3v4l.org/rCEqD

kgsdhlau

kgsdhlau2#

我可以回答RegEx模式部分:(E?\d{3,4} ?[A-Z]?(?=\s)),在https://regex101.com处使用以下文本块进行测试:

258 Game of Thrones E457 Pokemon
293A Wool Bed cover 572 C Steel frame whatever
258 Game of Thrones
E457 Pokemon
293A Wool Bed cover
572 C Steel frame whatever
Decorative pillow / Set with bed covers 2456 55Χ55cm
Pillow 207 45 Χ 65 cm

相关问题