Gå til innhold

Hente ut bilder fra tekst, og plassere dem i array


Anbefalte innlegg

Videoannonse
Annonse

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 av grimjoey
Lenke til kommentar

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 :p

Lenke til kommentar
Gjest Slettet+142

 

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 :p

 

 

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
Gjest Slettet+142

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 av Slettet+142
Lenke til kommentar
Gjest Slettet+142

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 av Slettet+142
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...