我需要你的帮助,解决一个问题,我正在排序大量的库存物品从一个API到一个在线商店。
我遇到的问题是,许多物品都是弹药,它们被归类为弹药,但我需要将它们按特定口径分类。
我用来导入和分类它们的工具支持正则表达式,所以我想看看是否可以这样解决这个问题。虽然我只知道使用正则表达式的基本知识,但我目前还不知道如何做这样的事情。我在想,我可以从标题中提取出口径,因为它们经常包含在其中。
该表达式可能需要排序的几个标题示例:
如果能从你们那里得到任何帮助或指导,我将不胜感激。如果我能通过Regex来解决这个问题,我会节省很多时间。
Edits / Expectation from the title:
Federal Cartridge 7mm RemMag 150gr SierBTSP VtSh/20 -> 7mm,
Winchester Ammo SupX 38 SPL Smokeless Powder , -> 38 SPL
Federal Cartridge 300 Sav 180gr SP Power-Shock /20, -> 300 Sav
Winchester Ammo USA 5.56MM (223) 55Gr. FMJ/20, -> 5.56MM
Winchester Ammo SupX 45 Colt 255Gr. Lead RN/20, -> 45 Colt
Winchester Ammo SupX 12ga 2.75″ 7.5-Shot HeavyGam, -> 12ga
Winchester Ammo SupX 22LR #12-Shot Rimfire /50, -> 22LR
Winchester Ammo SupX 7.62X39 123gr SP/20 -> 7.62x39我希望这比较容易理解。很抱歉有这么晚的跟进。工作一直在蚕食我的时间。
发布于 2018-08-20 20:38:20
可以这样编写regex模式(有几种正确的方法可以这样做):
演示:https://regex101.com/r/uVq3W1/3/
~(?:\d+(?:\.\d+)?(?|mm|x\d+)|\d+(?|ga|lr| Sav| Colt| SPL))\b~i或者像这样在逻辑上拆分以帮助您查看分组:
~
(?:
\d+(?:\.\d+)?(?|mm|x\d+)
|
\d+(?|ga|lr| Sav| Colt| SPL)
)
\b
~i\b元字符是一个单词边界,它确保以所需字符串开头的较大单词不匹配。(您不想与1 splash相匹配)
i模式修饰符(在末尾)强制regex引擎不敏感地匹配案例。
(?: ... )是一个非捕获组,(?| ...)是一个分支重置组.https://regular-expressions.mobi/branchreset.html?wlr=1有效地,这些是用来维护模式逻辑。
+是一个量词,意思是前面表达式的“一个或多个”。
?是一个量词,意思是前面表达式的“0或1”。
发布于 2018-08-03 03:32:04
试试看。这将执行一个类似的比较搜索您的标题与每编译的一系列口径。输出将是一个数组,其中每个键都是找到的口径。
为了使这个工作,您将必须创建一个数组的口径,您希望找到。您可能甚至可以找到一个相当全面的列表,您可以很容易地转换成一个数组。
不管怎样,给你。
$titles = array(
'Remington 7.62x51mm 149gr FMJ',
'Horandy .45cal HP',
'Federal Cartridge Classic Buckshot 16ga 2 3/4" 1',
'Winchester Ammo USA 5.56MM (223) 55Gr. FMJ/20',
'Federal Cartridge 7.62x51mm 149gr FMJ /500'
);
$calibers = array(
'7.62x51',
'.22',
'.45',
'9mm'
);
foreach($calibers as $caliber){
$results[$caliber] = array_filter($titles, function ($item) use ($caliber) {
if (stripos($item, $caliber) !== false) {
return TRUE;
}
return FALSE;
});
}
print_r($results);这将产生以下结果:
Array
(
[7.62x51] => Array
(
[0] => Remington 7.62x51mm 149gr FMJ
[4] => Federal Cartridge 7.62x51mm 149gr FMJ /500
)
[.22] => Array
(
)
[.45] => Array
(
[1] => Horandy .45cal HP
)
[9mm] => Array
(
)
)https://stackoverflow.com/questions/51664616
复制相似问题