remi sture Skrevet 18. april 2007 Forfatter Skrevet 18. april 2007 Til dette er jo SimpleXML genial da?
grimjoey Skrevet 18. april 2007 Skrevet 18. april 2007 Sikkert. Har ikke hørt om det. Jeg ville skrevet funksjonen kun for å lære. Har ikke noe bruk for den.
remi sture Skrevet 18. april 2007 Forfatter Skrevet 18. april 2007 Oki. Sikkert veldig fornuftig det. :-)
grimjoey Skrevet 18. april 2007 Skrevet 18. april 2007 (endret) BTW: her er koden som til slutt funket til alle som vil snatche den. Klikk for å se/fjerne innholdet nedenfor <?php function parseTags($input, $tagName = 'img') { $getTagsPattern = '/<'.$tagName.' ([a-z]{2,10}=[\'|"]([a-zA-Z\\/.><:;# 0-9_-]*)[\'|"] *)*\/?>/'; $getSettingsPattern = '/([a-zA-Z]{2,10})=[\'|"]([^"|\']*)[\'|"]/'; preg_match_all($getTagsPattern,$input,$gotTags); foreach($gotTags[0] as $keyOne => $tags) { preg_match_all($getSettingsPattern,$tags,$gotSettings); $settings = $gotSettings[1]; $values = $gotSettings[2]; foreach($settings as $keyTwo => $setting) { $imgTagsFoo[$setting] = $values[$keyTwo]; } $imgTags[$keyOne] = $imgTagsFoo; unset($imgTagsFoo); } return($imgTags); } $inputString = 'aslkdfjalskdjf<img src="asda.asd" style="border: 1px solid #000;" alt="asdadasdadadsad" />askd<input type="balla" name="navnballa">alsk<img src="123" alt="as d">asdaskj'; print_r(parseTags($inputString)); print_r(parseTags($inputString,'input')); ?> Edit: Nå generisk! bruk: parseTags(string Inputstring, string Tagnavn); OPPDATERT Endret 18. april 2007 av grimjoey
remi sture Skrevet 18. april 2007 Forfatter Skrevet 18. april 2007 Heisann. Jeg får ikke noe resultat når jeg tester med følgende tag: <img src="files/Image/profiler/2007/100/andre_dahl_klippet.jpg" border="1" alt="" width="100" height="98" align="left" /> Peiling på hvorfor?
grimjoey Skrevet 18. april 2007 Skrevet 18. april 2007 den skal virke nå. oppdaterte ovenfor. rettet 2 feil.
stiber Skrevet 19. april 2007 Skrevet 19. april 2007 SimpleXML kan forøvrig brukes til dette også. PHP <?php$string = "<img src="dette er en ikke well formed xml test">"; $xml = simplexml_import_dom(DOMDocument::loadHTML($string)); $result = $xml->xpath('//img'); $images = array(); foreach( $result as $i => $node) { foreach($node->attributes() as $key => $value) { $images[$i][$key] = (string)$value; } } var_dump($images); Grunnen til den merkelige måten å oprette simpleXML objektet på, er for å unngå masse feilmeldinger når dokumentet du prøver å laste ikke er helt "well formed", noe som gjelder eksemplet over (og mye annen kode forøvrig). Samtidig kan jeg nevne at de regex setningene som er nevnt vil feile på flere områder. Her er noen eksempler: src='nå skal faktisk " være lovlig' (blanding av ' og " er et problem) src=|dette virker faktisk| (| er ikke "eller" operator i character classes) Det er bare mulig med et mellomrom mellom tag navn og atributt, og ikke \s+ som ville være naturlig. Det er noen flere, men må legge meg nå... For å lese attributt verdi ville jeg gått for noe slik ([\'"])((?>.(?!\\1))*.)\\1 Finn først ut om det er brukt single eller double quote rundt for så å matche alt som ikke er det, før du så kommer til avsluttende quote. På grunn av at back references ikke virker i character classes ( eks [^\\1] ), så "må me juksa litt", og derfor ser det så jæ**a stygt/uforståelig ut. Så fasiten er, bruk DOM og/eller SimpleXML med xpath, det er litt enklere
grimjoey Skrevet 19. april 2007 Skrevet 19. april 2007 hva med (['"]).*\1 ? altså ([\'"]).*\\1 i php ? takk for infoen forresten.
Gjest Slettet+142 Skrevet 26. april 2007 Skrevet 26. april 2007 SimpleXML kan forøvrig brukes til dette også. PHP <?php$string = "<img src="dette er en ikke well formed xml test">"; $xml = simplexml_import_dom(DOMDocument::loadHTML($string)); $result = $xml->xpath('//img'); $images = array(); foreach( $result as $i => $node) { foreach($node->attributes() as $key => $value) { $images[$i][$key] = (string)$value; } } var_dump($images); Grunnen til den merkelige måten å oprette simpleXML objektet på, er for å unngå masse feilmeldinger når dokumentet du prøver å laste ikke er helt "well formed", noe som gjelder eksemplet over (og mye annen kode forøvrig). Samtidig kan jeg nevne at de regex setningene som er nevnt vil feile på flere områder. Her er noen eksempler: src='nå skal faktisk " være lovlig' (blanding av ' og " er et problem) src=|dette virker faktisk| (| er ikke "eller" operator i character classes) Det er bare mulig med et mellomrom mellom tag navn og atributt, og ikke \s+ som ville være naturlig. Det er noen flere, men må legge meg nå... For å lese attributt verdi ville jeg gått for noe slik ([\'"])((?>.(?!\\1))*.)\\1 Finn først ut om det er brukt single eller double quote rundt for så å matche alt som ikke er det, før du så kommer til avsluttende quote. På grunn av at back references ikke virker i character classes ( eks [^\\1] ), så "må me juksa litt", og derfor ser det så jæ**a stygt/uforståelig ut. Så fasiten er, bruk DOM og/eller SimpleXML med xpath, det er litt enklere 8418817[/snapback] hvordan gjør man dette med linker? har klart å endre fra //img til //a, men det jeg ikke får til er å få tak i det som er mellom <a...> og </a> =/ noen som har en fasit eller guide? [jeg har sett hos php.net, men.. ja. så jeg spør her..]
stiber Skrevet 26. april 2007 Skrevet 26. april 2007 PHP <?php$xml = simplexml_import_dom(DOMDocument::loadHTML($string)); $result = $xml->xpath('//a'); foreach( $result as $i => $node) { echo $node; }
Gjest Slettet+142 Skrevet 26. april 2007 Skrevet 26. april 2007 (endret) aii.. det var jo for enkelt til å være sant =/ bokstavelig talt: PHP <?php$string = "<a href='dette er en ikke well formed xml test'>Test</a><a href='lol.htm'><i><b>Test2</b></i></a>"; $xml = simplexml_import_dom(DOMDocument::loadHTML($string)); $result = $xml->xpath('//a'); $images = array(); foreach( $result as $i => $node) { foreach($node->attributes() as $key => $value) { $images[$i][$key] = (string)$value; } $images[$i]["text"] = (string)$node; print_r($images[$i]); echo '<br>'; } ?> Output: Array ( [href] => dette er en ikke well formed xml test [text] => Test )Array ( [href] => lol.htm [text] => ) det som ikke virker er hvis det i mellom <a..> og </a> er noen nye elementer. som i eksempelet over, <a...><i*><b*>tekst</*b></*i></a> Endret 26. april 2007 av Slettet+142
stiber Skrevet 27. april 2007 Skrevet 27. april 2007 det som ikke virker er hvis det i mellom <a..> og </a> er noen nye elementer. som i eksempelet over, <a...><i*><b*>tekst</*b></*i></a> 8482112[/snapback] PHP <?php$node->children()->asXML();
Gjest Slettet+142 Skrevet 27. april 2007 Skrevet 27. april 2007 (endret) ok. nå har jeg prøvd litt av hvert her. har kommet fram til en liten underlig kode som garantert kan forbedres. men hvordan? Kode: $string = "<a href='dette er en ikke well formed xml test'>Test <img alt='hei2' src='bah2.jpg'><img alt='hei' src='bah.jpg'></a><a href='lol.htm'><i><b>Test2</b></i></a>"; $xml = simplexml_import_dom(DOMDocument::loadHTML($string)); $result = $xml->xpath('//a'); $images = array(); foreach( $result as $i => $node) { foreach($node->attributes() as $key => $value) { $images[$i][$key] = (string)$value; } //$images[$i]["text"] = (string)$node; barn($node, $images[$i]["text"]); print_r($images[$i]); echo '<br>'; } function barn($node, &$result, &$times=0){ $times++; if((string)$node !="") $result["node"] .= (string)$node; if($times!=1) // så slipper jeg at $images[$i]["text"] får tillagt a-attributtene foreach($node->attributes() as $key => $val){ $result[$key] .= $val.';;;'; } foreach($node->children() as $sec){ barn($sec, $result, $times); } } Output: Array ( [href] => dette er en ikke well formed xml test [text] => Array ( [node] => Test [alt] => hei2;;;hei;;; [src] => bah2.jpg;;;bah.jpg;;; ) )Array ( [href] => lol.htm [text] => Array ( [node] => Test2 ) ) er denne mulig å forbedre i det hele tatt? Endret 27. april 2007 av Slettet+142
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå