Avatar billede tentakkel Nybegynder
06. juni 2007 - 16:10 Der er 1 kommentar og
1 løsning

Match all inden i match all

Hej

Jeg skal i PHP prøve at fange en struktur der ligger flere steder. Jeg er derfør nødt til først at fange det rigtige område førend jeg fanger strukturen.

Ideen er lidt ala

<a>
sdfjh
<b>bad1_value1</b>
adsfafds
<b>bad2_value2</b>
asdfasfd
</a>
<c>
æalfjsælasjf
<b>god1_value3</b>
asdhdf
<b>god2_value4</b>
shgdshsd
</c>

De data jeg ønsker at få frem er
god1
god2
value3
value4

Så enten kunne jeg regexp af to omgange
først
§<c>.*?</c>§s
og så efterfølgende køre en ala
§<b>(.*?)_(.*?)</b>§s

Men det kan umulig være det smarteste. Så jeg ville prøve at smække disse to sammen.

jeg har prøved adskillige varianter, men er ikke kommet til mere end at få indholdet af den første gode <b> ud...

ser ud som følger:

§<c>(.*?<b>(.*?)_(.*?)</b>.*?)+.*?</c>§s

men ak... den vil slet slet ikke. Nogen ideer?
Avatar billede tmi Nybegynder
17. juli 2007 - 08:53 #1
Når du gentager en subpattern vil kun den sidste der passer blive fanget:

When a capturing subpattern is repeated, the value captured is the substring that matched the final iteration. For example, after (tweedle[dume]{3}\s*)+ has matched "tweedledum tweedledee" the value of the captured substring is "tweedledee". However, if there are nested capturing subpatterns, the corresponding captured values may have been set in previous iterations. For example, after /(a|(b))+/ matches "aba" the value of the second captured substring is "b".

Derfor kan du ikke gøre det på den måde, hvis du ikke ved hvor mange <b></b> der er i <c>. Så er du nødt til at gøre det af 2 omgange.

Hvis du ved hvor mange der er skal lave en subpattern for hver af dem.

PS: .*? er det samme som .*, da * betyder {0,} og ? betyder {0,1}. Husk at bruge modifier i og U, ligesom du har brugt s. Så er du ikke afhængig af om der skrives <C> eller <c>. U gør at * og ? ikke går fra første <c> til sidste </c> selvomd der er andre <c> og </c> i mellem!

God dag :-)
Avatar billede tentakkel Nybegynder
20. juli 2007 - 19:19 #2
takker... det var ogsaa lidt det jeg frygtede...
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