remi sture Skrevet 18. april 2007 Forfatter Del Skrevet 18. april 2007 Til dette er jo SimpleXML genial da? Lenke til kommentar
grimjoey Skrevet 18. april 2007 Del 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. Lenke til kommentar
remi sture Skrevet 18. april 2007 Forfatter Del Skrevet 18. april 2007 Oki. Sikkert veldig fornuftig det. :-) Lenke til kommentar
grimjoey Skrevet 18. april 2007 Del 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 Lenke til kommentar
remi sture Skrevet 18. april 2007 Forfatter Del 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? Lenke til kommentar
grimjoey Skrevet 18. april 2007 Del Skrevet 18. april 2007 den skal virke nå. oppdaterte ovenfor. rettet 2 feil. Lenke til kommentar
stiber Skrevet 19. april 2007 Del 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 Lenke til kommentar
grimjoey Skrevet 19. april 2007 Del Skrevet 19. april 2007 hva med (['"]).*\1 ? altså ([\'"]).*\\1 i php ? takk for infoen forresten. Lenke til kommentar
Gjest Slettet+142 Skrevet 26. april 2007 Del 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..] Lenke til kommentar
stiber Skrevet 26. april 2007 Del Skrevet 26. april 2007 PHP <?php$xml = simplexml_import_dom(DOMDocument::loadHTML($string)); $result = $xml->xpath('//a'); foreach( $result as $i => $node) { echo $node; } Lenke til kommentar
Gjest Slettet+142 Skrevet 26. april 2007 Del 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 Lenke til kommentar
stiber Skrevet 27. april 2007 Del 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(); Lenke til kommentar
Gjest Slettet+142 Skrevet 27. april 2007 Del 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 Lenke til kommentar
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å