PDA

Pogčedajte punu verziju : PHP: Kada parser da "stane"


Bojsi
16. 07. 2014., 22:44
Pozdrav,

Imam jedan nadam se trivijalan problem. Izvinjavam se sto nisam mogao da smislim bolji naslov :(

Potrebno mi je da prodjem kroz sledeci string (uz pomoc PHP-a) i izdvojim kompletan tag:


<php:page>
<php:button>Test</php:button>
</php:page>


Odmah mi je na pamet palo sledece resenje:


$patterns[] = "|\<php:(.*?)\>(.*?)\</php:(.*?)\>|e";
$replaces[] = "\$this->createControl(\"$1\", \"$2\");";

return preg_replace($patterns, $replaces, $data);


Naravno, ono ne radi jer ce izvuci <php:page> a zavrsiti sa </php:button>

Da li mogu nekako da "fiksiram" drugu polovinu izraza (zatvaranje taga), da $3 mora da bude jednak $1 da bi stao sa parsiranjem, tako da stane tek kada opet naidje na </php:page>.

Mozda mogu da drugacije uradim i "izvucem" posebno button, page itd. ali se nadam da moze bolje (a i da naucim za kasnije).

Nadam se da sam dobro objasnio,

Hvala

Br@nkoR
16. 07. 2014., 22:57
http://php.net/manual/en/regexp.reference.back-references.php
http://www.regular-expressions.info/backref.html

Bojsi
16. 07. 2014., 23:59
http://php.net/manual/en/regexp.reference.back-references.php
http://www.regular-expressions.info/backref.html

Hvala druze. Sad razumem koncept. Iz nekog razloga moj kod nece da radi ako prosto stavim:

$patterns[] = "|\<php:(.*?)\>(.*?)\</php:\1\>|e";

ali sada bar znam sta da trazim.

Bojsi
17. 07. 2014., 03:45
Nesto ne ide. Ne znam gde gresim, nista mi izraz ne nalazi. Mozda neko zna gde gresim. Vec je kasno pa se nadam da nisam zaboravio i ono sto sam znao.


$s = '<php:page><php:button>Test</php:button></php:page>';

$patterns[] = "|\<php:(.*?)\>(.*?)\</php:\1\>|s";
$replaces[] = "X";

echo preg_replace($patterns, $replaces, $s);

Br@nkoR
17. 07. 2014., 08:47
$patterns[] = "|\<php:(.*?)\>(.*?)\</php:\\1\>|s";
ili
$patterns[] = '|\<php:(.*?)\>(.*?)\</php:\1\>|s';
ili
$patterns[] = "|\<php:(.*?)\>(.*?)\</php:\g1\>|s";

\1 unutar navodnika (") postaje 1

Bojsi
17. 07. 2014., 13:28
Hvala, to je to. Nikad ne bih provalio.

Hvala jos jednom.

Bojsi
22. 09. 2014., 06:18
Potrebna mi je jos jedna pomoc ako moze, problem se nadovezuje:

Pravim neki mini template sistem (za sopstvene potrebe) gde imam tagove u stilu:


<php:ime_kontrole>...</php:ime_kontrole>


Kada se procita ovo ime_kontrole, ja izrenderujem tu kontrolu i onda dalje obradjujem njene child kontrole.

Unutar tagova za kontrolu, mogu se nalaziti i tagovi za svojstva (property).

Ceo primer:


<property name="title">Ovo je pravi naslov</property>
<php:button>
<property name="title">Ovo je pogresan naslov</property>
<property name="styleClass">test</property>
</php:button>


Kao sto vidite, imam jednu ugnjezdenu kontrolu (button) i ona opet ima svoje propertije.

I koristim sledeci (PHP) kod da obradim propertije:


$patterns[] = "|\<property name=\"(.*?)\"\>(.*?)\</property\>|e";
$replaces[] = "\$this->setProperty($1, \"$2\");";

$value = preg_replace($patterns, $replaces, $value);


Medjutim, ovde opet nastaje problem jer ce mi obrada "pokupiti" i propertije unutar button kontrole, sto je nepozeljno. Dakle, zelim da parser ne "zalazi" u <php:ime_kontrole> tagove (bilo kog nivoa).

Verovatno treba da iskljucim grupu koju koristim za "citanje" tagova za kontrole:

"|\<php:(.*?)\>(.*?)\</php:\\1\>|e";

ali ne znam gde to da postavim?

Hvala jos jednom.