/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Sammenligning vha. preg_match
Fra : J.


Dato : 09-05-02 13:39

Hej folkens.

Jeg skal sammenligne en variabel med et udtræk fra en database. Altså
således:

if ( preg_match( "/$r_res[0]/", $value ) )

hvor $r_res[0] er udtrækket og $value er variablen.

Hvad nu, hvis jeg gerne vil have en tolerance på 1-3 bogstaver på? Hvis nu
f.eks. den skal godtage

$r_res[0] = "gud"

$value = "gud"
$value = "guds"
$value = "guder"
$value = "guders"

men IKKE

$value = "guderne"

altså, den matcher såfremt værdierne enten er ens, eller variablen er 1,2
eller 3 bogstaver længere end databaseværdien men har samme
begyndelseseform.

Jeg ved at dette:

if ( preg_match( "/$r_res[0]\w/", $value ) )

giver 1 bogstavs tolerance. Men hvad hvis jeg vil have en tolerance, så den
kan finde alle ord uanset om de har 0, 1, 2 eller 3 bogstaver efter sig?

På forhånd tak og ha' en god dag

J.



 
 
Jacob Bunk Nielsen (09-05-2002)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 09-05-02 13:47

"J." <test@neovoid.org> writes:

> Jeg ved at dette:
>
> if ( preg_match( "/$r_res[0]\w/", $value ) )
>
> giver 1 bogstavs tolerance. Men hvad hvis jeg vil have en tolerance, så den
> kan finde alle ord uanset om de har 0, 1, 2 eller 3 bogstaver efter sig?

Mon så ikke du kan bruge:

if ( preg_match( "/$r_res[0](\w){0,3}/", $value ) )

.... med forbehold for at jeg ikke er vildt godt inde i Perls regex-halløj.

--
Jacob - www.bunk.cc
The future will be better tomorrow.

J. (09-05-2002)
Kommentar
Fra : J.


Dato : 09-05-02 14:03


"Jacob Bunk Nielsen" <spam@bunk.cc> wrote in message
news:spamdrop+m37kmdo5dq.fsf@paven.bunk.cc...
> "J." <test@neovoid.org> writes:
>
> > Jeg ved at dette:
> >
> > if ( preg_match( "/$r_res[0]\w/", $value ) )
> >
> > giver 1 bogstavs tolerance. Men hvad hvis jeg vil have en tolerance, så
den
> > kan finde alle ord uanset om de har 0, 1, 2 eller 3 bogstaver efter sig?
>
> Mon så ikke du kan bruge:
>
> if ( preg_match( "/$r_res[0](\w){0,3}/", $value ) )
>
> ... med forbehold for at jeg ikke er vildt godt inde i Perls regex-halløj.


Narj, det gider den ikke... så splitter den ordene helt op i stedet.

Måske skal der byttes lidt rundt på parenteser? Jeg er heller ikke hajen til
det.

Hvis du har bedre styr på PHP's POLIX (eller hvad den nu hedder) i stedet
for PERL, må du da gerne give et eksempel der i stedet.

Tak for hurtigt svar, for resten.

- J.




Jacob Bunk Nielsen (09-05-2002)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 09-05-02 21:51

"J." <test@neovoid.org> writes:

>> if ( preg_match( "/$r_res[0](\w){0,3}/", $value ) )
>>
>> ... med forbehold for at jeg ikke er vildt godt inde i Perls regex-halløj.
>
> Narj, det gider den ikke... så splitter den ordene helt op i stedet.

Hvad betyder "\w"? "word"? I så fald er det forståeligt at det ikke
lige virker. Prøv evt. med "\s" i stedet.

> Måske skal der byttes lidt rundt på parenteser? Jeg er heller ikke hajen til
> det.

Prøv!

> Hvis du har bedre styr på PHP's POLIX (eller hvad den nu hedder) i stedet
> for PERL, må du da gerne give et eksempel der i stedet.

Hvis det hedder noget, så hedder det nok POSIX.

prøv med

eregi("gud[a-z]{0,3}", "guder")

Indsæt selv variable efter behov. Vær opmærksom på at du måske bare
vil bruge ereg() i stedet for eregi(), alt afhængig af om du vil have
store og små bogstaver med. Husk også å, ø og å.

> Tak for hurtigt svar, for resten.

Beklager at jeg ikke kunne gøre det helt så hurtigt anden gang

--
Jacob - www.bunk.cc
All extremists should be taken out and shot.

J. (09-05-2002)
Kommentar
Fra : J.


Dato : 09-05-02 23:56

"Jacob Bunk Nielsen" <spam@bunk.cc> wrote in message
news:spamdrop+m3g011yrj5.fsf@paven.bunk.cc...

> Hvad betyder "\w"? "word"? I så fald er det forståeligt at det ikke
> lige virker. Prøv evt. med "\s" i stedet.

Jep, "word" som i "bogstav", heheh. Altså, et "word character".

> > Hvis du har bedre styr på PHP's POLIX (eller hvad den nu hedder) i
stedet
> > for PERL, må du da gerne give et eksempel der i stedet.
>
> Hvis det hedder noget, så hedder det nok POSIX.

Ja, selvfølgelig. Jeg vil gerne lære Perl-syntaksen og det skulle efter
sigende også være en anelse hurtigere end POSIX, så det er den jeg primært
arbejder ud fra.

Jeg fandt dog et svar inde på Eksperten. Det viser sig at hvad du sagde
næsten var den korrekte syntaks. Der manglede bare et ^ foran og et $
bagefter, sådan er Perl åbenbart. Den endelige løsning er derfor:

if ( preg_match( "/^$r_res[0]\w{0,3}$/", $value ) )

Jeg blev i hvert fald klogere - og jeg håber da også at andre kan bruge det
her til noget.

Hurtigt eller ej, jeg takker stadig for din respons. Det er sådan noget som
det der gør at nyhedsgrupper står for hjælpsomme og pålidelige svar i min
opfattelse.

- J.



Jacob Bunk Nielsen (10-05-2002)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 10-05-02 09:46

"J." <test@neovoid.org> writes:

>> Hvad betyder "\w"? "word"? I så fald er det forståeligt at det ikke
>> lige virker. Prøv evt. med "\s" i stedet.
>
> Jep, "word" som i "bogstav", heheh. Altså, et "word character".

Prøvede du med "\s" i stedet?

Jeg kiggede lige i min "Programming Perl" (som jeg snart skal have
læst en masse i :), og den siger at "\S" (stort S, jeg huskede
forkert) er "Any nonwhitespace character", mens "\w" er "any "word"
character (alphanumerics plus "_")." Snuppet fra side 161 i 3rd
edition.

> if ( preg_match( "/^$r_res[0]\w{0,3}$/", $value ) )

Betyder "$" ikke slutningen på en linie? Det er i hvert fald hvad min
lokale Perl-hacker siger

Så dit regex matcher starten på en linie (^), $r_res[0], 0-3 "word
characters" og til sidst slutningen på linien. Det vil sige at det
ikke vil fange "guder er grønne", hvor det måske skulle fange "guder"?

--
Jacob - www.bunk.cc
Booze is the answer. I don't remember the question.

J. (10-05-2002)
Kommentar
Fra : J.


Dato : 10-05-02 12:13


"Jacob Bunk Nielsen" <spam@bunk.cc> wrote in message
news:spamdrop+m3offocrx1.fsf@paven.bunk.cc...

> Prøvede du med "\s" i stedet?
>
> Jeg kiggede lige i min "Programming Perl" (som jeg snart skal have
> læst en masse i :), og den siger at "\S" (stort S, jeg huskede
> forkert) er "Any nonwhitespace character", mens "\w" er "any "word"
> character (alphanumerics plus "_")." Snuppet fra side 161 i 3rd
> edition.

Jeg har selvfølgelig også selv nævnte bog, men jeg har dog snuppet
definitionerne fra php.net i dette tilfælde (da jeg synes bogens regexp-dele
er lidt rodede). Forklaring for at jeg ikke bruger \s, følger lige om
lidt...

> Betyder "$" ikke slutningen på en linie? Det er i hvert fald hvad min
> lokale Perl-hacker siger
>
> Så dit regex matcher starten på en linie (^), $r_res[0], 0-3 "word
> characters" og til sidst slutningen på linien. Det vil sige at det
> ikke vil fange "guder er grønne", hvor det måske skulle fange "guder"?

Jeg fik ikke sagt i hvilken sammenhæng det skal bruges. Ser du, der bruges
allerede inden et preg_split, hvor strengen deles op ved diverse
skillekarakterer (komma, punktum etc.) og alle ordene lægges i en array.
Derfor vil der aldrig blive behandlet mere end et ord af gangen, og
alfanumeriske karakterer er rigeligt passende i denne sammenhæng. Grunden
til at den skal bruge denne tolerance er for at tage højde for andre
bøjninger af ordet.

- J.



Søg
Reklame
Statistik
Spørgsmål : 177522
Tips : 31968
Nyheder : 719565
Indlæg : 6408662
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste