1

PHP で preg_match_all を使用して、これらのそれぞれを独自のグループにキャプチャしたいと思います。

  1. 章、セクション、またはページ
  2. 指定された章、セクション、またはページの番号 (ある場合は文字)。それらの間に単一のスペースがある場合は、それを考慮する必要があります
  3. 「および」、「または」という言葉

文字列内の項目数は動的である可能性があることに注意してください。正規表現は以下のすべての例で機能するはずです。

  1. Ch1とSect2b
  2. Ch 4 x blahunwantedtext および Sect 5y および Sect6 z および Ch7 または Ch8

これは私がこれまでに思いついたものです:

<?php

    $str = 'Ch 1 a and Sect 2b and Pg3';
    preg_match_all ('/([a-z]+)([\s]?[0-9]+)([\s]?[a-z]*)([\s]?and*[\s]?)/is', $str, $matches);

    Array
    (
        [0] => Array
            (
                [0] => Ch 1 a and 
                [1] => Sect 2b and 
            )

        [1] => Array
            (
                [0] => Ch
                [1] => Sect
            )

        [2] => Array
            (
                [0] =>  1
                [1] =>  2
            )

        [3] => Array
            (
                [0] =>  a
                [1] => b
            )

        [4] => Array
            (
                [0] =>  and 
                [1] =>  and 
            )

    )

配列内の文字列 (Pg3) の最後の部分を一致させることができません。

期待される結果は次のとおりです。

    Array
    (
        [0] => Array
            (
                [0] => Ch 1 a and 
                [1] => Sect 2b and 
                [2] => Pg3
            )

        [1] => Array
            (
                [0] => Ch
                [1] => Sect
                [2] => Pg
            )

        [2] => Array
            (
                [0] =>  1
                [1] =>  2
                [2] =>  3
            )

        [3] => Array
            (
                [0] =>  a
                [1] => b
                [2] => 
            )

        [4] => Array
            (
                [0] =>  and 
                [1] =>  and 
                [2] =>  
            )

    )
4

1 に答える 1

1

この正規表現は機能するはず/(ch|sect|pg)\s*(\d)\s*([a-z]?\b)\s*(and|or)?/iです:

$str = 'Ch 1 a and Sect 2b and Pg3';
preg_match_all('/(ch|sect|pg)\s*(\d)\s*([a-z]?\b)\s*(and|or)?/i', $str, $matches);


array (size=5)
  0 => 
    array (size=3)
      0 => string 'Ch 1 a and' (length=10)
      1 => string 'Sect 2b and' (length=11)
      2 => string 'Pg3' (length=3)
  1 => 
    array (size=3)
      0 => string 'Ch' (length=2)
      1 => string 'Sect' (length=4)
      2 => string 'Pg' (length=2)
  2 => 
    array (size=3)
      0 => string '1' (length=1)
      1 => string '2' (length=1)
      2 => string '3' (length=1)
  3 => 
    array (size=3)
      0 => string 'a' (length=1)
      1 => string 'b' (length=1)
      2 => string '' (length=0)
  4 => 
    array (size=3)
      0 => string 'and' (length=3)
      1 => string 'and' (length=3)
      2 => string '' (length=0)
于 2013-01-13T07:26:47.470 に答える