Avatar billede alvion Nybegynder
28. november 2000 - 00:40 Der er 5 kommentarer og
1 løsning

RegExp parsing af string

Tre spørgsmål:

1) Hvad er forskellen på preg_match (Perl-klonen) og ereg (Posix-klonen) ? Giver de ikke samme resultater=

2) Et specifikt problem:

$s = \"12<a34b>56<a78b>90\";
$r = \"/<a.*b>/is\";
echo preg_replace($r, $s, \"dav\");

Ovenstående ville jeg gerne have til at udskrive:

12div56dav90

men istedet udskrives:

dav

3) Med ovenstående streng (og regexp) ønsker jeg at udtrække de enkelte matchede del-strenge. Enten i et array eller i en løkke, hvor jeg får dem ud en af gangen.

Jeg har prøvet med preg_match_all(), men jeg synes ikke rigtig jeg kan få det til at virke. Jeg har på fornemmelsen, at preg_match() ser de to del-strenge som ét stort match.

Jeg er stadig meget ny i PHP og især RegExp.
Avatar billede alvion Nybegynder
28. november 2000 - 00:53 #1
Ok, jeg har selv fundet ud af noget:

$r = \"/<a[^<]*b>/is\";

Derudover indeholdte replace-sætningen en fejl (jeg havde byttet om på \"dav\" og $s):
   
echo preg_replace($r, \"dav\", $s);


Men vi ændrer lige spørgsmålet:

$s = \"12<section>3<name>foo</name>4</section>56<section>78</section>90\";
$r = \"/(<section>.*<\\/section>)/is\";
echo preg_replace($r, \"dav\", $s);

skulle gerne stadig give:

12div56dav90

men giver

12dav90

Spørgsmål 3) er i øvrigt stadig åbent for det nye problem jeg har introduceret
Avatar billede alvion Nybegynder
28. november 2000 - 00:58 #2
$r = \"/(<section>[^(<\\/section>)]*<\\/section>)/is\";

giver

12<section>3<name>foo</name>4</section>56dav90

Dvs. den sidste <section>..</section> bliver matchet, men den første gør ikke - sikkert fordi den indeholder andre <..> </..> blokke?
Avatar billede amfelt Nybegynder
28. november 2000 - 08:07 #3
Jeg tror du skal kikke på ereg funktionen istedet
-----Klip fra manualen ----------
if (ereg (\"([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})\", $date, $regs)) {
    echo \"$regs[3].$regs[2].$regs[1]\";
} else {
    echo \"Invalid date format: $date\";
}
------- End Klip --------
Hvordan vil du få div inde i resultatet nå der i preg_replace kun stå \"dav\" ???

Prøv at kikke på mit indlæg fra igår ! http: -> <a href det kan være du kan låne noget der !
Mvh Rolf
Avatar billede alvion Nybegynder
28. november 2000 - 10:06 #4
Det var også en skrivefejl, der skulle selvfølgelig stå:

12div56dav90

Jeg tror i øvrigt at jeg har grejet den nu:

$reg = \"/(<section>.*?<\\/section>)/is\";
preg_match_all($reg, $strHtml, $matches, PREG_PATTERN_ORDER);
for ($i=0; $i<count($matches[0]); $i++)
    $echo $matches[0][$i] . \"\\n\";


Det er meget fint, at du foreslår ereg istedet, men hvorfor? Hvad kan den, som preg_match ikke kan?
Avatar billede amfelt Nybegynder
28. november 2000 - 10:26 #5
Havede ikke læst ordenligt på preg de er næsten ens ! undskyld !
Avatar billede alvion Nybegynder
15. april 2001 - 16:03 #6
Lukker nu
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