Php rekurzív regex
Üdv.
Van egy ilyenem:aminek rossz a kimenete:helyette ilyet szeretnék:Már tanácstalan vagyok.
A lényeg, hogy a functionnek vagy van blokkja, vagy nincs, ha nincsen neki, akkor is function néven szeretném megkapni, és nyilván ha van blokk záró tag, akkor van neki blokkja. A fenti esetben ez sajnos nem teljesül.
Különböző nevű functionöknél nincs vele gond, de azonos nevűektől kiakad.
■ Van egy ilyenem:
$pattern='%(?<string>.*?){(?<function>\w+)(?:}(?<block>(?R)*?.*?){/(?P=function))?}%sD';
$test=
'text1
{test}
d1 begin
{test}
d2 begin
{test}
d2 end
{/test}
d1 end
{/test}
text2
{test}
d1b begin,end
{/test}';
preg_match_all($pattern,$test,$matches,PREG_SET_ORDER);
var_dump($matches);
array (
0 =>
array (
0 => 'text1{test}d1 begin{test}d2 begin{test}d2 end{/test}',
'string' => 'text1',
'function' => 'test',
'block' => 'd1 begin{test}d2 begin{test}d2 end',
),
1 =>
array (
0 => 'd1 end{/test}text2{test}d1b begin,end{/test}',
'string' => 'd1 end{/test}text2',
'function' => 'test',
'block' => 'd1b begin,end',
),
)
array (
0 =>
array (
0 => 'text1{test}d1 begin{test}d2 begin{test}d2 end{/test}d1 end{/test}',
'string' => 'text1',
'function' => 'test',
'block' => 'd1 begin{test}d2 begin{test}d2 end{/test}d1 end',
),
1 =>
array (
0 => 'text2{test}d1b begin,end{/test}',
'string' => 'text2',
'function' => 'test',
'block' => 'd1b begin,end',
),
)
A lényeg, hogy a functionnek vagy van blokkja, vagy nincs, ha nincsen neki, akkor is function néven szeretném megkapni, és nyilván ha van blokk záró tag, akkor van neki blokkja. A fenti esetben ez sajnos nem teljesül.
Különböző nevű functionöknél nincs vele gond, de azonos nevűektől kiakad.
Ertelmetlen
Rosszul tudod
Ha a blokkos változatot és a blokk nélkülit külön szedném, és a blokkosat raknám elsődlegesnek, akkor rendesen működne. Ami miatt a mostani formát választottam, az az, hogy így ugyanúgy function nevet kap a függvény neve.
Ha jól emlékszem van valami megoldás arra, hogy egy elfogó csoport nevet több regex rész használhasson. Majd utánanézek.
Amiben igazad van az az, hogy konkrétan ezt a nyelvet nem lehet lefedni vele, ha viszont az egysoros(blokk nélküli) dolgok megadási módját külön tudom választani a többsorosakétól(blokkal rendelkező), akkor lehetséges. Lehet, hogy elég annyi elválasztásnak, hogy jelen esetben a test az csak többsoros lehet. (Mindössze annyi a para, hogy a blokkal rendelkező függvény valamiért nincs prioritásban a blokk nélkülivel szemben. Hiába rakom őket mondjuk egy |-al elválasztott csoportba. (Ott a prioritása a legelsőnek a legnagyobb elvileg. Sajnos ez a rekurzivitásban valamiért nem érvényesül.) Gondolom mindez a regex feldolgozó működéséből adódik.)
Hmm a test-re is teljesen jót ad:
(Ahogy nézem Smartysok az unicode karakterekre sem gondoltak, most szoptam vele én is.)
Kipróbáltam nagyban is a fenti megoldást, aztán kiderült, hogy bugos a php pcre motorja. Szóval ehelyett a preg_match_all %...|$%-os téma helyett visszatértem a preg_split + %...%-os verzióra, mert az szépen működik (viszont lassabb). Ez van.
Nyitottam is ide egy bug reportot, ha valakit érdekel.