【问题标题】:Sort plain text data in php在php中对纯文本数据进行排序
【发布时间】:2018-12-20 08:42:51
【问题描述】:

我有以下纯文本格式的数据,我正在尝试以特定格式对其进行排序,以便我可以将每个值保存在数据库表中

G28585 alphabounce+ 20 $55.00 $55.00 $1,100.00 FTWWHT/CYBEMT/ECRTIN 尺寸 9- 11 11- 12 12- 13 14 数量 2 6 2 2 1 4 3 D97028 adizero 8.0 100 $66.00 $66.00 $6,60 9- 10 10- 11 11- 12 12- 13 13- 14 数量 5 5 10 8 15 10 17 9 14 4 3 D97031 adizero 8.0 SK 68 $68.75 $68.75 $4,675.00 FTWWHT/POWRED/ACTRED 尺寸 10 102- 11 11 13 13- 14 15 数量 3 4 4 3 5 3 25 4 15 2 F97396 Freak Carbon Low 37 $49.50 $49.50 $1,831.50 FTWWHT/POWRED/ACTRED 尺寸 9 9- 10 10- 11 11- 12 12- 13 14 数量 2 1 3 4 3 2 6 3 7 6

我正在尝试以这种格式保存它,但我无法区分的是我应该如何分隔文本,因为我没有任何分隔符:

G28585 alphabounce+ 20 $55.00 $55.00 $1,100.00 FTWWHT/CYBEMT/ECRTIN 尺寸 9- 11 11- 12 12- 13 14 数量 2 6 2 2 1 4 3

............

D97028 adizero 8.0 100 $66.00 $66.00 $6,600.00 FTWWHT/POWRED/ACTRED 尺寸 9 9- 10 10- 11 11- 12 12- 13 13- 14 数量 5 5 10 8 15 10 17 9 14 4 3

请指导,任何帮助将不胜感激。 这是我从中得到文本的pdf..

【问题讨论】:

  • 你要按照什么逻辑来分离?
  • 恐怕如果你不知道如何分开,我们当然不能告诉你。你必须至少有一些规则、模式之类的东西。
  • 您能否提供一些您迄今为止尝试过的代码并给出具体问题?
  • 断点似乎是 G28585/D97028 字段。由于该格式(即大写字母和 5 个数字)在您显示可以构建正则表达式的数据中似乎是唯一的?
  • Mayby 正则表达式模式/(?=[A-Z]\d+)/regex101.com/r/Xt2hXr/1

标签: php arrays string


【解决方案1】:

如果您的代码仅包含字符后跟 5 位数字,您可以这样做

$str = "G28585 alphabounce+ 20 $55.00 $55.00 $1,100.00 FTWWHT/CYBEMT/ECRTIN Size 9- 11 11- 12 12- 13 14 Qty 2 6 2 2 1 4 3 D97028 adizero 8.0 100 $66.00 $66.00 $6,600.00 FTWWHT/POWRED/ACTRED Size 9 9- 10 10- 11 11- 12 12- 13 13- 14 Qty 5 5 10 8 15 10 17 9 14 4 3 D97031 adizero 8.0 SK 68 $68.75 $68.75 $4,675.00 FTWWHT/POWRED/ACTRED Size 10 10- 11 11- 12 12- 13 13- 14 15 Qty 3 4 4 3 5 3 25 4 15 2 F97396 Freak Carbon Low 37 $49.50 $49.50 $1,831.50 FTWWHT/POWRED/ACTRED Size 9 9- 10 10- 11 11- 12 12- 13 14 Qty 2 1 3 4 3 2 6 3 7 6";

 $splitted = preg_split('/(?=[A-Z][0-9]){6}/',$str,-1,PREG_SPLIT_NO_EMPTY);

print_r($splitted);

http://sandbox.onlinephpfunctions.com/code/7ad702ae20c9884c8c2348052610ad979f43d876

【讨论】:

  • preg_split('/(?=[A-Z][0-9]){6}/',$str,-1,PREG_SPLIT_NO_EMPTY); 省去array_filter 的麻烦
  • 这里有一些魔法! ?= 是干什么用的?我不知道如何在输出中捕获拆分。
  • @Progrock stackoverflow.com/questions/22438877/… 查看此链接了解详细信息?=
  • 发现并理解了非常有用的感谢(请领奖!)。
【解决方案2】:

您可以在产品代码前面放置一个分隔符(这似乎是一种独特的模式),然后在上面分割。这里我使用换行符作为分隔符:

<?php

$txt = "G28585 alphabounce+ 20 $55.00 $55.00 $1,100.00 FTWWHT/CYBEMT/ECRTIN Size 9- 11 11- 12 12- 13 14 Qty 2 6 2 2 1 4 3 D97028 adizero 8.0 100 $66.00 $66.00 $6,600.00 FTWWHT/POWRED/ACTRED Size 9 9- 10 10- 11 11- 12 12- 13 13- 14 Qty 5 5 10 8 15 10 17 9 14 4 3 D97031 adizero 8.0 SK 68 $68.75 $68.75 $4,675.00 FTWWHT/POWRED/ACTRED Size 10 10- 11 11- 12 12- 13 13- 14 15 Qty 3 4 4 3 5 3 25 4 15 2 F97396 Freak Carbon Low 37 $49.50 $49.50 $1,831.50 FTWWHT/POWRED/ACTRED Size 9 9- 10 10- 11 11- 12 12- 13 14 Qty 2 1 3 4 3 2 6 3 7 6";

var_export(
    preg_split(
        '/\R/',
        trim(
            preg_replace(
                '/([A-Z][0-9]+)/',
                "\n$1",
            $txt)
        )
    )
);

输出:

array (
  0 => 'G28585 alphabounce+ 20 $55.00 $55.00 $1,100.00 FTWWHT/CYBEMT/ECRTIN Size 9- 11 11- 12 12- 13 14 Qty 2 6 2 2 1 4 3 ',
  1 => 'D97028 adizero 8.0 100 $66.00 $66.00 $6,600.00 FTWWHT/POWRED/ACTRED Size 9 9- 10 10- 11 11- 12 12- 13 13- 14 Qty 5 5 10 8 15 10 17 9 14 4 3 ',
  2 => 'D97031 adizero 8.0 SK 68 $68.75 $68.75 $4,675.00 FTWWHT/POWRED/ACTRED Size 10 10- 11 11- 12 12- 13 13- 14 15 Qty 3 4 4 3 5 3 25 4 15 2 ',
  3 => 'F97396 Freak Carbon Low 37 $49.50 $49.50 $1,831.50 FTWWHT/POWRED/ACTRED Size 9 9- 10 10- 11 11- 12 12- 13 14 Qty 2 1 3 4 3 2 6 3 7 6',
)

【讨论】:

  • 感谢 @Progrock 提供此解决方案,但它不适用于以下字符串文本:12FXPK2SDUJW9Y SOUTH DAKOTA, U OF SDAK​​O GAMEMODE POL 11 $37.50 $37.50 $412.50 PWRD MEL/WHT 尺寸 S M L X 数量 1 6 3 1
  • 像@Shibon 那样使用积极的前瞻,您可以一次性完成。
  • @Mohanish 哦,不同的数据样本。您必须调整正则表达式以适应。
【解决方案3】:

正则表达式的另一种解决方案

$raw = 'G28585 SOUTH DAKOTA, U OF SDAKO GAMEMODE POL 20 $55.00 $55.00 $1,100.00 FTWWHT/CYBEMT/ECRTIN Size 9- 11 11- 12 12- 13 14 Qty 2 6 2 2 1 4 3 D97028 adizero 8.0 100 $66.00 $66.00 $6,600.00 FTWWHT/POWRED/ACTRED Size 9 9- 10 10- 11 11- 12 12- 13 13- 14 Qty 5 5 10 8 15 10 17 9 14 4 3 D97031 adizero 8.0 SK 68 $68.75 $68.75 $4,675.00 FTWWHT/POWRED/ACTRED Size 10 10- 11 11- 12 12- 13 13- 14 15 Qty 3 4 4 3 5 3 25 4 15 2 F97396 Freak Carbon Low 37 $49.50 $49.50 $1,831.50 FTWWHT/POWRED/ACTRED Size 9 9- 10 10- 11 11- 12 12- 13 14 Qty 2 1 3 4 3 2 6 3 7 6';

$pattern ='/(?<style>\w+) (?<descr>[a-zA-Z, 0-9.+]+) (?<prices>[$0-9., ]+) (?<color>\w+\/\w+\/\w+) Size (?<size>[0-9 -]+) Qty (?<quantity>[0-9 ]+)/';

preg_match_all($pattern, $raw, $matches);
$matches = array_diff_key($matches, range(0, 6));
print_r($matches);

输出:

Array
(
    [style] => Array
        (
            [0] => G28585
            [1] => D97028
            [2] => D97031
            [3] => F97396
        )

    [descr] => Array
        (
            [0] => SOUTH DAKOTA, U OF SDAKO GAMEMODE POL 20
            [1] => adizero 8.0 100
            [2] => adizero 8.0 SK 68
            [3] => Freak Carbon Low 37
        )

    [prices] => Array
        (
            [0] => $55.00 $55.00 $1,100.00
            [1] => $66.00 $66.00 $6,600.00
            [2] => $68.75 $68.75 $4,675.00
            [3] => $49.50 $49.50 $1,831.50
        )

    [color] => Array
        (
            [0] => FTWWHT/CYBEMT/ECRTIN
            [1] => FTWWHT/POWRED/ACTRED
            [2] => FTWWHT/POWRED/ACTRED
            [3] => FTWWHT/POWRED/ACTRED
        )

    [size] => Array
        (
            [0] => 9- 11 11- 12 12- 13 14
            [1] => 9 9- 10 10- 11 11- 12 12- 13 13- 14
            [2] => 10 10- 11 11- 12 12- 13 13- 14 15
            [3] => 9 9- 10 10- 11 11- 12 12- 13 14
        )

    [quantity] => Array
        (
            [0] => 2 6 2 2 1 4 3 
            [1] => 5 5 10 8 15 10 17 9 14 4 3 
            [2] => 3 4 4 3 5 3 25 4 15 2 
            [3] => 2 1 3 4 3 2 6 3 7 6
        )

)

【讨论】:

  • 哦,这太可爱了
猜你喜欢
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 2013-03-08
相关资源
最近更新 更多