|
|||||||||||||||||||||||||||
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 regexen. 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 regexen 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 *.¸¸.·*
(¸.·´(¸.·* *·.¸)`·.¸)
|
||||||||||||||
|
||||||||||||||