Avatar billede zurekk Nybegynder
01. januar 2008 - 22:25 Der er 9 kommentarer og
1 løsning

if-else

Hej Eksperter,

Jeg skal bruge en regex som matcher dette:
<if#ID>TRUE</if#ID>
evt. noget her
<else#ID>FALSE</if#ID>

Ville være endnu bedre hvis jeg ikke behøvede slutte med ID'et, altså </if> og </else>.

Det jeg har fået bikset sammen er:

/<if#(?<id>[^>]+)>(?<true>.*)<\/if#\k<id>>.*?(<else#\k<id>>(?<false>.*)<\/else#\k<id>>)/is

Den virker fint, men det er bare et krav at der findes en ELSE-statement.
Derfor prøver jeg så med '?' til sidst, men så finder den slet ikke min ELSE-statement -_-

Hvad gør jeg forkert?

På forhånd tak!
Avatar billede nielle Nybegynder
01. januar 2008 - 22:42 #1
> Ville være endnu bedre hvis jeg ikke behøvede slutte med ID'et, altså </if> og </else>.

Hvordan ser din idelle tekst ud, den som du ønsker at kunne matche? Med og uden en else-del.
Avatar billede zurekk Nybegynder
02. januar 2008 - 00:06 #2
<if#ABC123>
  <b>Jepsen</b>
</if>

Måske 30 linjers HTML.

<else#ABC123>
  <i>Desværre</i>
</else>


Og uden, ville bare være uden de sidste 3 linjer :-)

Og jeg skal så bruge <ID>, <TRUE>, <FALSE>.
Avatar billede nielle Nybegynder
02. januar 2008 - 10:28 #3
Mulig løsning til formen 02/01-2008 00:06:19:

Nu har jeg ikke en helt ny PHP-version og derfor kan jeg ikke bruge:

(?<navn>) og \k<navn>

I stedet må jeg bruge:

(?P<navn>) og (?P=navn)

Men dette virker da for mig - med og uden else-delen:

$pattern = '&<if#(?P<id>[^>]+)>(?P<true>.*?)</if>(?:.*?<else#(?P=id)>(?P<false>.*?)</else>)?&is';
preg_match($pattern, $input, $matches);
echo $matches['id'] . "<br>" . $matches['true'] . "<br>" . $matches['false'];

Personligt synes jeg så ikke lige at navngivne grupper giver noget ekstra i dette tilfælde. Selv ville jeg bare bruge denne version:

$pattern = '&<if#([^>]+)>(.*?)</if>(?:.*?<else#\1>(.*?)</else>)?&is';
preg_match($pattern, $input, $matches);
echo $matches[1] . "<br>" . $matches[2] . "<br>" . $matches[3];
Avatar billede zurekk Nybegynder
02. januar 2008 - 10:57 #4
Jamen jeg siger tusind tak :D

Smid et svar!

(har du evt. lidt styr på Apache/Xampp må du godt tage et kig på: http://www.eksperten.dk/spm/812596; tror ikke apache kategorien er særlig aktiv :-) )
Avatar billede zurekk Nybegynder
02. januar 2008 - 11:56 #5
Hvordan sørger jeg forresten for ikke at replace teksten mellem IF og ELSE?
Den skulle helst ikke fanges.
Avatar billede nielle Nybegynder
02. januar 2008 - 12:43 #6
Der er vist ikkke nogen nem måde at bevare mellem-teksten hvis den ikke må catches. Hvorfor må den ikke det?

Desværre, mht. Appache.
Avatar billede zurekk Nybegynder
02. januar 2008 - 12:51 #7
Oh well, måtte den sådan set også.

Nu prøver jeg istedet at finde en IF-statement og imens jeg behandler finder jeg så en evt. ELSE-statement :-)

Anyway, thanks!
Avatar billede nielle Nybegynder
02. januar 2008 - 13:07 #8
Du kan muligvis lave et eller andet smart med preg_replace_callback():

http://dk2.php.net/manual/en/function.preg-replace-callback.php
Avatar billede zurekk Nybegynder
02. januar 2008 - 13:13 #9
Er hvad jeg hele tiden har gjort :-P
Avatar billede zurekk Nybegynder
02. januar 2008 - 13:16 #10
Men det er sgu ikke så ligetil endda :(
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester