SkÃ¥ne Sjælland Linux User Group - http://www.sslug.dk Förstasida   Anmälning   Postarkiv   Forum   Kalender   Sök
MhonArc Dato: [Date Prev] [Kronologisk oversigt] [Date Next]   TrÃ¥d: [Date Prev] [Oversigt trÃ¥de] [Date Next]   MhonArc
 

Hjælp til Perl Regular Expressions



Hejsa :)
 
Jeg har lavet en funktion i php som praser <mytags> fra et string.
Well ved godt dette er en Perl mailingliste, men jeg poster her pga. at jeg
bruger perl regular expressions for at prase teksten.
Og hvis I svarer så må i meget gerne svarer i den rigtige perl regex – så
skal jeg selv finde ud af hvorledes jeg skifter om til PCRE.
 
Hvis man indsætter følgende input i funktionen:
Dette er en test <mytag id="titletop" type="text" value="boo">yjyj</mytag>
foo test <mytag id="synopsis" type="textarea" value="eksempel
data">gdfgfg</mytag> Dette er en test
<mYtag id="the-end" type="text"/>
<mytag id="the-end" type="text"/></mytag>
<mytag>amir <mytag>dsg <mytag></mytag></mytag> <h> </mytag>
 
Så skal den outputte:
[0] <mytag id="titletop" type="text" value="boo">yjyj</mytag>
[1] <mytag id="synopsis" type="textarea" value="eksempel
data">gdfgfg</mytag>
[2] <mYtag id="the-end" type="text"/>
[3] <mytag id="the-end" type="text"/></mytag>
[4] <mytag>amir <mytag>dsg <mytag></mytag></mytag> <h> </mytag>
 
Ok dette har jeg så lavet – dog har jeg brugt MEGET lang tid på det og jeg
kan ikke engang selv fatte regex’en. Min funktion med min regex ser således
ud:
function tage_tags_ud($tekst, $tagnavn)
{
//Reg ex mønster som den søger efter.
$moenster =
"(?U:<$tagnavn.*>.*</$tagnavn>(?!(<$tagnavn.*>)|(((?=.*<$tagnavn.*>).)*</$ta
gnavn>)|(((?:(?!<$tagnavn.*>).)*)</$tagnavn>)))|(<$tagnavn.*?/>)";
 
//Kører igennem hele teksten og laver en multidimensional array
preg_match_all("-$moenster-i", $tekst, $match);
 
//Returner array
return $match[0];
}
 
$test = tage_tags_ud($test_tekst,"mytag");
 
for ($i=0; $i<count($test); $i++){
echo "[$i] ".$test[$i]."\n";
}
 
Og ja, jeg har mistet kontrollen over denne regex :’( Men den virker (i
NOGLE af tilfældene, mere om det senere)
 
Altså, jeg startede ud med at sætte U flaget på (dvs. at den ikke skulle
være greedy). Dernæst har jeg brugt mange lookaheds or | (eller). Endvidere
har jeg til sidst at den kan finde <mytag muuh=”muuh” />
Man kunne også lægge ud med
/(<mytag.*>.*</mytag>)|(<$tagnavn.*?/>)/
 
Problemet opstår så når jeg prøver at neste flere mytags: 
            <mytag>amir <mytag>dsg <mytag></mytag></mytag> <mytag></mytag>
<h> </mytag>
Så deler den det op i 
            [0] <mytag>amir <mytag>dsg <mytag></mytag></mytag>
[1] <mytag></mytag> <h> </mytag>
 
Er der nogen som har nogle gode idéer til hvorledes man kunne bygge en regex
som kan udtage <tags> ud af et dokument, hvor tags kan være nested i tags?
 
Som jeg sagde før, så er jeg ligeglad om dette er opbygget i Perl eller php
– det er regex’en som er vigtigt i dette tilfælde.
 
På forhånd tak :-)
 
Med venlig hislen
Amir Salihefendic
-- 
     Name: Amir Salihefendic
    Internet ID:  <mailto:sslug@sslug> sslug@sslug
             (*·.¸(`·.¸ ¸.·´)¸.·*)
      *·.¸¸.* www.amix.dk *.¸¸.·*
             (¸.·´(¸.·* *·.¸)`·.¸)
 


 
Förstasida   Anmälning   Postarkiv   Översikt   Kalender   Sök

 
 
Fel och synpunkter angående webb-sidorna skickas till <www_admin>. Senaste ändring 2005-08-10, klockan 19:56
Denna sidan underholds av MHonArc .