このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/php/1168450843/675
#  質問です。PHP5.3でpreg_matchを使っているのですが、例えば 
#  「次章(第20条の3、第1節の3、・・・除き、建築基準法第80条の2にあっては・・・」 
#  という文章より法律名称や条などをwhileループで拾い上げたいのですが、 
#   

'「次章(第20条の3、第1節の3、・・・除き、建築基準法第80条の2にあっては・・・」という文章より法律名称や条などをwhileループで拾い上げたい'(_文,_法律名称や条のならび) :-
        法律名称を拾う(_文,0,_開始位置付き法律名称ならび),
        条を拾う(_文,_開始位置付き条ならび),
        法律名称と条を出現順にならびとする(_開始位置付き条ならび,_法律名称や条ならび).


法律名称を拾う(_文,_開始位置,[[_開始位置1,S2]|R]) :-
        sub_atom(_文,_相対開始位置,_長さ,_,S1,S2,S3,L1,L2,L3),
        sub_atom(S2,_,1,0,法),
        法律名称(S2),
        _開始位置1 is _開始位置 + _相対開始位置,
        _開始位置2 is _開始位置 + _相対開始位置 + _長さ,
        法律名称を拾う(S3,_開始位置2,R),!.

条を拾う(_文,[[_開始位置1,S2]|R]) :-
        sub_atom(_文,_相対開始位置,_長さ,_,S1,S2,S3,L1,L2,L3),
        sub_atom(S2,0,1,_,第),
        sub_atom(S2,_,1,0,条),
        _開始位置1 is _開始位置 + _相対開始位置,
        _開始位置2 is _開始位置 + _相対開始位置 + _長さ,
        条を拾う(S3,_開始位置2,R).

法律名称と条を出現順にならびとする(_開始位置付き法律名称ならび,_開始位置付き条ならび,_法律名称や条ならび) :-
        append(_開始位置付き法律名称ならび,_開始位置付き条ならび,L1),
        sort(L1,L2),
        findall(_法律名称または条,(
                    append(_,[[_,_法律名称や条]|_],L2)),
                _法律名称や条ならび).