Avatar billede michaeltryl Seniormester
19. september 2007 - 02:21 Der er 15 kommentarer og
2 løsninger

problem med preg_match

jeg har denne kode:

$tekst = $show[tekst];
$dato = $show[dato];
$tid = $show[tid];
//$tekst kan f.eks indeholde "<boks>noget tekst</boks> noget andet tekst"

preg_match("/([^<\/boks>]+)<\/boks> (.+)/", $tekst, $regs);
$tekst = $regs[2];

$_SESSION['kommentar'] ="<boks>$forfatter skrev d. $dato $tid: $tekst</boks> ";

det virker for så vidt fint, men problemet opstår, når $teskt som hentes fra databasen ikke indeholder <boks></boks>, så er $tekst tom når den puttes i $_SESSION['kommentar'].
jeg har prøvet med
if (preg_match("/([^<\/boks>]+)<\/boks> (.+)/", $tekst, $regs))
{
$tekst = $regs[2];
}
men lige lidt hjælper det. er der en som har et bud på hvad jeg kan gøre.
Avatar billede michaeltryl Seniormester
19. september 2007 - 02:23 #1
glemte at skrive at i f.eks
"<boks>noget tekst</boks> noget andet tekst"
ønsker jeg at hente "noget andet tekst" ud og hvis der ikke er <boks></boks> i $tekst, skal alt det tekst som hentes fra databasen bruges i $_SESSION['kommentar']
Avatar billede jakobdo Ekspert
19. september 2007 - 08:54 #2
Ønsker du at fjernet <boks>tekst</boks> hvis det er der?
Avatar billede nielle Nybegynder
19. september 2007 - 09:29 #3
Lige en helt generel kommentar om regulære udtryk. Din konstruktion:

[^<\/boks>]

betyder *ikke* "noget tekst som ikke er '<\/boks>'" som du lader til at tro.

Det betyder derimod "et vilkårligt tegn som ikke er et '<', '/', 'b', 'o', 'k', 's' eller et '>'".
Avatar billede michaeltryl Seniormester
19. september 2007 - 09:47 #4
ja jeg ønsker at fjerne <boks>tekst</boks> hvis det er der og jeg er ikke så meget inde i regulære udtryk, men preg_match("/([^<\/boks>]+)<\/boks> (.+)/", $tekst, $regs) virker fint hvis <boks>tekst</boks> er til stede, men ikke hvis det ikke er der.
Hvad er det som i [^<\/boks>], bestemmer at det er et vilkårligt tegn, som ikke er et '<', '/', 'b', 'o', 'k', 's' eller et '>'". jeg har forstået det sådan at det er et punktum der bruges til at matche et hvilket som helst tegn, som jeg læser den jeg har lavet læser den fra starten af strengen (^) frem til og med </boks>.
Det skal måske også siges at <boks>tekst</boks> altid vil stå som det første i strengen.
Avatar billede nielle Nybegynder
19. september 2007 - 09:52 #5
Det er simpelthen sådan at [^...] er defineret:

[^abc]

skal læses som en betingesle på enkelt-tegns basis:

"et vilkårligt tegn som hverken er et 'a' eller et 'b' eller et 'c'"
Avatar billede jakobdo Ekspert
19. september 2007 - 09:53 #6
Måske i stil med:
$ny_tekst = preg_replace('%<boks>.*?</boks>%', '', $tekst);
Avatar billede nielle Nybegynder
19. september 2007 - 09:54 #7
... omvendt skal

[abc]

læses - stadig på enkelt-tegsn basis:

"et 'a' eller et 'b' eller et 'c'"

En anden måde at skrive den på er:

(a|b|c)
Avatar billede michaeltryl Seniormester
19. september 2007 - 10:01 #8
mange tak jacobdo, det virker.
Til nielle, tak for den præcise forklaring på det, jeg havde misforstået brugen af []
Jeg vil godt give jer begge point, så bare smid et svar.
tak til jer begge.
Avatar billede jakobdo Ekspert
19. september 2007 - 10:17 #9
Svar!
Avatar billede nielle Nybegynder
19. september 2007 - 10:22 #10
Svar, men giv du bare de fleste point til jacobdo. :^)
Avatar billede jakobdo Ekspert
19. september 2007 - 10:43 #11
Takker for point. :o)
Avatar billede nielle Nybegynder
19. september 2007 - 18:25 #12
Takker :^)
Avatar billede michaeltryl Seniormester
23. september 2007 - 01:23 #13
Jeg har opdaget, at hvis der er linieskift i det, som er mellem <boks> og </boks> så bliver det ikke fjernet.
eks.
<boks>her er noget
tekst som ikke skal være
her</boks>
i dette tilfælde kommer det hele med. Det virker kun hvis det hele er skrevet ud i en køre uden linieskift. Er der en måde til at undgå dette?
Avatar billede nielle Nybegynder
23. september 2007 - 08:50 #14
Prøv at ændre:

ny_tekst = preg_replace('%<boks>.*?</boks>%', '', $tekst);

til:

ny_tekst = preg_replace('%<boks>.*?</boks>%s', '', $tekst);
Avatar billede michaeltryl Seniormester
23. september 2007 - 10:17 #15
det gjorde tricket.
Det "s" du har indsat i slutningen, gør det at der matches
space/mellemrum, incl. bl.a. tabs (\t) og newlines (\n) eller er det kun "\s" som gør dette?
Avatar billede nielle Nybegynder
23. september 2007 - 10:24 #16
s'et står for "single-line" og gør at eventuelle linjeskifttegn (\r og \n) i $tekst behandles som et hvert andet tegn. Uden s'et ville regexp-motoren forsøge at behandle det hele som et antal linjer og matche på hver af dem separat. Dette giver selvfølgeligt problemer hvis det der skal matches på ligger i hver sin linje af $tekst.

I \s står s'et for noget lidt andet - nemlig for space, eller rettere sagt white-space, hvilket er tegnene ' ', \t, \r og \n.

De to s'er har altså ikke direkte noget at gøre med hinanden.
Avatar billede michaeltryl Seniormester
23. september 2007 - 10:35 #17
okay tak for det
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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