【问题标题】:Keeping the delimiter in preg_split in php将分隔符保留在 php 中的 preg_split 中
【发布时间】:2016-02-02 17:19:19
【问题描述】:

我正在尝试根据特定的分隔符将文本文件拆分为多个部分。

文本文件的 sn-p

    1_1_ABA-BUL
Sat           Tjedan(i)   Datum            Učiona     Predavač(i)        Kolegij             Način   Grupa
Ponedjeljak
08:00-10:00   1 - 17      5.10    - 25.1   DV 12      ŠTAMPALIJA ALKA    POSLOVNI NJEMAČKI   P       1_1_ABA-BUL, 1_2_BULJ-GAB, 1_3_GAC-JUK,
                                                                         JEZIK I                     1_4_JUL-LOR, 1_5_LOS-MOR
10:00-12:00   1 - 17      5.10    - 25.1   SPORTSKA   HERCEG ROMINA      TJELESNA I          S       1_1_2_BES-BUL
                                                                         ZDRAVSTVENA
                                                                         KULTURA I
12:00-14:00   1 - 17      5.10    - 25.1   DV 26      VARGA MLADEN       INFORMATIKA         P       1_1_ABA-BUL
Utorak
08:00-10:00   1 - 17      6.10    - 26.1   DV 12      ŠTAMPALIJA ALKA    POSLOVNI NJEMAČKI   S       1_1_ABA-BUL, 1_2_BULJ-GAB, 1_3_GAC-JUK,
                                                                         JEZIK I                     1_4_JUL-LOR, 1_5_LOS-MOR
08:00-10:00   1 - 17      6.10    - 26.1   DV 20      SLADOLJEV AGEJEV   POSLOVNI ENGLESKI   P       1_1_ABA-BUL
                                                      TAMARA             JEZIK I
12:00-14:00   1 - 17      6.10    - 26.1   DV 40      ZOROJA JOVANA      INFORMATIKA         S       1_1_1_ABA-BER
12:00-14:00   1 - 17      6.10    - 26.1   DV 18      SLADOLJEV AGEJEV   POSLOVNI ENGLESKI   S       1_1_2_BES-BUL
                                                      TAMARA             JEZIK I
Srijeda
08:00-11:00   1 - 17      7.10    - 27.1   DV 01      PULJIĆ KRUNOSLAV   MATEMATIKA          P       1_1_ABA-BUL
11:00-14:00   1 - 17      7.10    - 27.1   DV 01      KRPAN MIRA         OSNOVE EKONOMIJE    P       1_1_ABA-BUL
14:00-16:00   1 - 17      7.10    - 27.1   DV 11      SLADOLJEV AGEJEV   POSLOVNI ENGLESKI   S       1_1_1_ABA-BER
                                                      TAMARA             JEZIK I
Četvrtak
11:00-14:00   1 - 17      8.10    - 28.1   DV 04      SLIŠKOVIĆ MARINA   MATEMATIKA          S       1_1_1_ABA-BER
Petak
09:00-12:00   1 - 17      9.10    - 29.1   DV 20      KRPAN MIRA         OSNOVE EKONOMIJE    S       1_1_2_BES-BUL
10:00-12:00   1 - 17      9.10    - 29.1   SPORTSKA   HERCEG ROMINA      TJELESNA I          S       1_1_1_ABA-BER
ZDRAVSTVENA
KULTURA I

12:00-15:00   1 - 17   9.10   - 29.1   DV 09   KRPAN MIRA         OSNOVE EKONOMIJE   S   1_1_1_ABA-BER
13:00-16:00   1 - 17   9.10   - 29.1   DV 01   SLIŠKOVIĆ MARINA   MATEMATIKA         S   1_1_2_BES-BUL
16:00-18:00   1 - 17   9.10   - 29.1   DV 40   AVDIĆ AMMAR,       INFORMATIKA        S   1_1_2_BES-BUL
VANJSKI INF

1_2_BULJ-GAB
Sat            Tjedan(i)   Datum            Učiona     Predavač(i)          Kolegij             Način   Grupa
Ponedjeljak
08:00-10:00    1 - 17      5.10    - 25.1   DV 12      ŠTAMPALIJA ALKA      POSLOVNI NJEMAČKI   P       1_1_ABA-BUL, 1_2_BULJ-GAB, 1_3_GAC-JUK,
                                                                            JEZIK I                     1_4_JUL-LOR, 1_5_LOS-MOR
10:00-13:00    1 - 17      5.10    - 25.1   DV 16      ŠEGO BOŠKO           MATEMATIKA          P       1_2_BULJ-GAB
14:00-16:00    1 - 17      5.10    - 25.1   DV 17      LEKAJ LUBINA BORKA   POSLOVNI ENGLESKI   P       1_2_BULJ-GAB
                                                                            JEZIK I
Utorak
08:00-10:00    1 - 17      6.10    - 26.1   DV 12      ŠTAMPALIJA ALKA      POSLOVNI NJEMAČKI   S       1_1_ABA-BUL, 1_2_BULJ-GAB, 1_3_GAC-JUK,
                                                                            JEZIK I                     1_4_JUL-LOR, 1_5_LOS-MOR
10:00-12:00    1 - 17      6.10    - 26.1   DV 01      PEJIĆ BACH MIRJANA   INFORMATIKA         P       1_2_BULJ-GAB
15:00-18:00    1 - 17      6.10    - 26.1   DV 11      HERCEG TOMISLAV      OSNOVE EKONOMIJE    P       1_2_BULJ-GAB
Srijeda
08:00-10:00    1 - 17      7.10    - 27.1   DV 42      MILANOVIĆ GLAVAN     INFORMATIKA         S       1_2_1_BULJ-DAJ
LJUBICA
10:00-12:00    1 - 17      7.10    - 27.1   DV 42      MILANOVIĆ GLAVAN     INFORMATIKA         S       1_2_2_DAK-GAB
                                                       LJUBICA
10:00-12:00    1 - 17      7.10    - 27.1   SPORTSKA   HERCEG ROMINA        TJELESNA I          S       1_2_1_BULJ-DAJ
                                                                            ZDRAVSTVENA
                                                                            KULTURA I
15:00-18:00    1 - 17      7.10    - 27.1   DV 23      HERCEG TOMISLAV      OSNOVE EKONOMIJE    S       1_2_1_BULJ-DAJ
18:00-21:00    1 - 17      7.10    - 27.1   DV 23      HERCEG TOMISLAV      OSNOVE EKONOMIJE    S       1_2_2_DAK-GAB
Četvrtak
Petak
10:00-12:00    1 - 17      9.10    - 29.1   SPORTSKA   HERCEG ROMINA        TJELESNA I          S       1_2_2_DAK-GAB
                                                                            ZDRAVSTVENA
                                                                            KULTURA I
11:00-14:00    1 - 17      9.10    - 29.1   DV 19      ŠKRINJARIĆ TIHANA    MATEMATIKA          S       1_2_1_BULJ-DAJ

12:00-14:00   1 - 17   9.10   - 29.1   DV 16   LEKAJ LUBINA BORKA   POSLOVNI ENGLESKI   S   1_2_2_DAK-GAB
                                                                    JEZIK I
14:00-17:00   1 - 17   9.10   - 29.1   DV 02   ŠKRINJARIĆ TIHANA    MATEMATIKA          S   1_2_2_DAK-GAB
14:00-16:00   1 - 17   9.10   - 29.1   DV 10   LEKAJ LUBINA BORKA   POSLOVNI ENGLESKI   S   1_2_1_BULJ-DAJ
JEZIK I

我在 1_1_ABA-BUL 行和其他相同格式的行(“Sat”字符串上方)拆分字符串。

这是我的 preg_split 线

$grupe = preg_split("/((.*?)\nSat)/", $source, PREG_SPLIT_NO_EMPTY |  PREG_SPLIT_DELIM_CAPTURE);

以下 preg_split 行不保留分隔符(1_1_ABA-BUL 等)。如果我把它改成

  $grupe = preg_split("/((.*?)\nSat)/", $source, -1, PREG_SPLIT_NO_EMPTY |  PREG_SPLIT_DELIM_CAPTURE);

结果数组不正确(我得到一个损坏的结果)。

我在这里做错了什么?

【问题讨论】:

    标签: php regex preg-split


    【解决方案1】:

    您使用preg_split() 的第一种方式似乎有效,但实际上并没有。

    它的第三个参数 ($limit) 是要返回的件数。刚好你用的文字不够长,条数小于等于3(PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE的值)。

    这就是你可以让它工作的方法:

    $grupe = preg_split('/(.*?)\n(?=Sat)/', $source, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    

    这是print_r($grupe) 的(截断)列表:

    Array
    (
        [0] =>     1_1_ABA-BUL
        [1] => Sat           Tjedan(i)   Datum            Učiona     Predavač(i)        Kolegij             Način   Grupa
    Ponedjeljak
    08:00-10:00   1 - 17      5.10    - 25.1   DV 12      ŠTAMPALIJA ALKA    POSLOVNI NJEMAČKI   P       1_1_ABA-BUL, 1_2_BULJ-GAB, 1_3_GAC-JUK,
                                                                             JEZIK I                     1_4_JUL-LOR, 1_5_LOS-MOR
    ...
    16:00-18:00   1 - 17   9.10   - 29.1   DV 40   AVDIĆ AMMAR,       INFORMATIKA        S   1_1_2_BES-BUL
    VANJSKI INF
    
    
        [2] => 1_2_BULJ-GAB
        [3] => Sat            Tjedan(i)   Datum            Učiona     Predavač(i)          Kolegij             Način   Grupa
    Ponedjeljak
    08:00-10:00    1 - 17      5.10    - 25.1   DV 12      ŠTAMPALIJA ALKA      POSLOVNI NJEMAČKI   P       1_1_ABA-BUL, 1_2_BULJ-GAB, 1_3_GAC-JUK,
    ...
    14:00-16:00   1 - 17   9.10   - 29.1   DV 10   LEKAJ LUBINA BORKA   POSLOVNI ENGLESKI   S   1_2_1_BULJ-DAJ
    JEZIK I
    
    )
    

    工作原理:

    正则表达式的重要变化是assertion(?=Sat)。它表示正则表达式的前一部分 ((.*?)\n) 仅当字符串的一部分后跟 Sat 时才匹配字符串的一部分。断言仅检查输入字符串中的下一个字符,但不使用它们。 Sat 部分不会成为分隔符的一部分。

    其余部分不变。标志PREG_SPLIT_DELIM_CAPTURE 使preg_split() 将捕获的正则表达式分隔符部分作为输出的各个部分返回。在上面的偏移量02 处找到它们。 Sat 子字符串只是一个断言,它不是分隔符的一部分,但它会在下一部分(它所属的位置)中返回。

    【讨论】:

    • 有没有办法让这个工作在分隔符不被拉到它自己的数组值中?我原以为如果您尝试保留分隔符,它将保留在实际的文本块中。
    猜你喜欢
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多