Gå til innhold

Hjelp til to regulæruttrykk (preg, ikkje ereg)


Anbefalte innlegg

Skrevet

God ettermiddag!

 

Å lage regulæruttrykk er ei av mine særs svake sider, og nok ein gong spør eg om hjelp.

 

Eg kunne trengt eit uttrykk for å validere ei linje. Linja skal bestå av to delar med kva som helst, separert med =. Det skal gå an å bruka = i begge dei to delane, men då skal det vera ein backslash framfor (\=).

 

Den neste skal skilja dei to delane frå kvarandre (med preg_split).

 

Eksempeloppgåvar:

home=heim
yes=ja
main-intro-header=Velkommen!
main-intro=Velkommen til xxx. Logg inn nedanfor. Bruk \=\=\= for å sjekka demoen

 

Som de forstår er det for å laga ei språkfil.

Videoannonse
Annonse
Skrevet (endret)

Trenger du preg_ til dette da?

Ska me sjå:

 

<?php

//Lager en funksjon til å fikse på det ene = tegnet
function replaceequals($str)
{
   return str_replace('=', 'THISISTHEMIDDLEEQUALSIGN', $str);
}

//Fjerner alle \= og lager en array
$splitted = explode('\=', $string);

//Bytter ut rene = tegn i arrayen med teksten i funksjonen over
array_map("replaceequals", $splitted);

//Slår sammen arrayen så = tegn blir vanlige (Uten \ )
$together = implode('=', $splitted);

//deler opp $together der hvor det originale ene = tegnet var
$beforeafter = explode('THISISTHEMIDDLEEQUALSIGN', $together);

//Setter variablene til det før (0) og det etter (1) = tegnet
$beforequal = $beforeafter[0];
$afterequal = $beforeafter[1];

?>

Endret av Jonhoo
Skrevet

Hmm. Vil ein spara noko på å unngå preg her? Den array-behandlinga der må då minst vera lika treig.

 

Får sjå kva eg vel.

Skrevet

Tja, synes ihvertfall koden min var enklere.

Vet ikke hvilken som er raskest, men nå har du jo fått begge kodene, så kanskje du vil gjøre oss den tjenesten å teste? :D

Skrevet

Tips: Bruk microtime(true) før og etter og trekk den store fra den lille og rundt av resultatet ;)

 

Nazgul, hadde du giddet å forklare RegExpen din? Så nå at jeg ikke kunne så mye som jeg trodde om det ^^

Skrevet (endret)
Tips: Bruk microtime(true) før og etter og trekk den store fra den lille og rundt av resultatet ;)

 

Nazgul, hadde du giddet å forklare RegExpen din? Så nå at jeg ikke kunne så mye som jeg trodde om det ^^

6300756[/snapback]

 

preg_split('/(?<!\\)=/', $linje)

6300565[/snapback]

Betyr kort og godt match alle '=' som ikke har en backslash foran seg.

(?<!\\)= betyr match '=' som _ikke_ har \\ (slash) foran seg (\=)

(?<=\\)= betyr match '=' som har \\ (slash) foran seg

 

I tillegg har du

(?=\\)= betyr match alle '=' som har påfølgende slash ( =\)

(?!\\)= betyr match alle '=' som _ikke_ har påfølgende slash

Endret av Nazgul
Skrevet (endret)

Det er regex-konstruksjonen som er slik.

?!

?=

?<!

?<=

Disse kan regnes som én modifier, som f.eks. ^

Endret av Nazgul
Skrevet (endret)

"De" er en konstruksjon, de betyr noe annet når de står for seg selv.

 

?! betyr "ikke etter"

?= betyr "etter"

?<! betyr "ikke før"

?<= betyr "før"

 

spørsmålstegnet kan ses på som et slags escape-tegn, i tillegg til det mer vanlige backslash (\)

Jeg klarer ikke å forklare bedre. Du må nesten bare se på postene over.

Endret av Nazgul
Skrevet (endret)

Nazqul:

Vil ikkje '/[^\\\]=/' virka lika godt som '/(?<!\\)=/', bare ikkje så IQ-sperra? :)

 

edit: Din løysing er den einaste som lar seg gjera med preg_split

Endret av knuto

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...