【问题标题】:Regular expression design for ammunition calibers弹药口径的正则表达式设计
【发布时间】:2019-01-10 20:59:09
【问题描述】:

我需要您的帮助来解决我将大量库存商品从 API 分类到在线商店的问题。

我遇到的问题是很多物品都是弹药,它们被归类,但我需要将它们分类为特定口径。

我用来导入它们并对其进行分类的工具支持正则表达式,所以我想看看我是否可以通过这种方式解决这个问题。虽然我只知道使用正则表达式的基础知识,但我目前不知道如何去做这样的事情。我想我可以从标题中提取口径,因为它们通常包含在其中。

表达式可能需要排序的几个标题示例:

  • 联邦弹药筒经典铅弹 16ga 2 3/4" 1
  • 美国温彻斯特弹药 5.56MM (223) 55Gr. FMJ/20
  • 联邦弹药筒 7.62x51mm 149gr FMJ /500

如果我能从你们那里得到任何帮助或指导,我将不胜感激。如果我可以通过正则表达式对其进行排序,它将为我节省很多时间。

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

我希望这更容易理解。抱歉,后续跟进晚了。工作一直在消耗我的时间。

【问题讨论】:

  • 当您说需要对标题进行排序时,如何您究竟需要对它们进行排序?我假设您想要一组中的弹药名称和另一组中的口径?其他信息呢?如果您可以将所需的 输出 与输入一起展示,那将非常有帮助。另外,到目前为止你有tried anything 吗?查看以前的尝试(即使它们非常不准确)将有助于我们确定您想要的结果。
  • @ObsidianAge 老实说,我实际上对从哪里开始一无所知。这就是我问的原因。
  • @mickmackusa 不幸的是,数据不包含该数据。我正在查看是否可以使用正则表达式制作此列或添加到数据中(如果有意义)。
  • 我可以帮助你,但我需要更多更好的信息。显示一系列输入值(如 10 或 20),然后显示您的预期结果。澄清一下,您想“重新排序”数据,还是“过滤”数据?
  • Ervin 请编辑您的问题以包含这些详细信息,然后删除您的 cmets。未来的研究人员将期望在问题主体中看到完整的故事。此外,很难阅读/分离您的注释字符串。确保您从样本输入中表达出您所期望的确切输出——如果您的问题不清楚,您将收到没有或很差的答案。我们是否了解您正在使用的 API?如果您展示您最好的编码尝试,我们会更好地理解您的问题。查看第一条评论(来自 Obsidian)

标签: php regex sorting woocommerce product


【解决方案1】:

试一试。这将对您的标题与每个编译的口径数组执行类似的比较搜索。输出将是一个数组,其中每个键都是找到的口径。

为了使其工作,您必须创建一个您希望找到的口径数组。您甚至可以在那里找到一个非常全面的列表,您可以轻松地将其转换为数组。

不管怎样,给你。

$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
        (
        )

)

【讨论】:

  • 我会看看我使用的插件是否支持PHP函数。如果是这样,那就太棒了。否则我需要手动创建它。
【解决方案2】:

正则表达式模式可以这样写(有几种正确的方法):

演示: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 模式修饰符(在末尾)强制正则表达式引擎不区分大小写地匹配。

(?: ... ) 是非捕获组,(?| ...) 是分支重置组。 https://regular-expressions.mobi/branchreset.html?wlr=1 实际上,这些用于维护模式逻辑。

+ 是一个量词,表示前面的表达式中的“一个或多个”。

? 是一个量词,表示前面表达式的“零或一”。

【讨论】:

    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多