PHPのpreg_match_allを使用して、これらのそれぞれを独自のグループにキャプチャしたいと思います。
- 章、セクション、またはページ
- 指定された章、セクション、またはページの番号(または文字がある場合は文字)。それらの間に単一のスペースがある場合は、それを考慮に入れる必要があります
- 「and」、「or」という言葉
すべての本のタイトルを無視したいので、文字列内のアイテムの数は動的である可能性があることを念頭に置いて、正規表現は以下のすべての例で機能するはずです。
- Ch1とSect2b
- Ch4x不要なタイトルとSect5y不要なタイトルとSect6zとCh7またはCh8
これは私がこれまでに思いついたものです:
$str = 'Ch 1 a unwantedtitle and Sect 2b unwanted title and Pg3';
preg_match_all ('/([a-z]+)(?=\d|\d\s)\s*(\d*)\s*(?<=\d|\d\s)([a-z]?).*?(and|or)?/i', $str, $matches);
Array
(
[0] => Array
(
[0] => Pg3
)
[1] => Array
(
[0] => Pg
)
[2] => Array
(
[0] => 3
)
[3] => Array
(
[0] =>
)
[4] => Array
(
[0] =>
)
)
期待される結果は次のようになります。
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] =>
)
)