Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] wyodrębnienie IMG z tekstu
Forum PHP.pl > Forum > Przedszkole
marian84
Witam!
Próbuję napisać funkcję, która przejrzy ciąg tekstu w html, a po odnalezieniu odnalezieniu "<img src itd", pobierze scieżke z src ale nic mi nie idzie. Macie może jakieś pomysły jak się za to zabrać ?

Necsord
  1. $htmlContent = '...';
  2. $dom = new DOMDocument;
  3. $dom->loadHTML($htmlContent);
  4. foreach($dom->getElementsByTagName('img') as $key => $value)
  5. {
  6. echo $value->getAttribute('src');
  7. }
ShadowD
@Necsord pierwszy raz widzę takie rozwiązanie jak się ma do wyrażeń regularnych?
Necsord
Regexp jest zdecydowanie szybszy. Szybki google link: http://blog.kamilbrenk.pl/pobieranie-adres...z-innej-strony/
Niby polecany jest także phpQuery, ale nigdy nie próbowałem. ( Edit. phpQuery bazuje na DOMDocument. )
marian84
OK, działa super. Teraz dalsza zagwozdka ... mam takie cuś:

  1. <?php
  2. $htmlContent='Lorem ipsum dolor sit amet, facere <img src="r1.gif" alt="jakiś opis" width="600px">dolores in fuerat accidens <img src="r2.gif">inquit merui litore <img src="r3.gif">est se vero quo. Hellenico clamabat vidit tam gratia de memor cresceret nomina petitus non ait in rei sensibilium. His auditorio iubet comprehenderent in deinde plectrum anni ipsa codicellos aperiri sacras. Est cum suam ut a his singulare eius sed, palpat venas tanquam vero non solutionem innocentem si non solutionem invenerunt. Adiuro me vero diam Apollonius.';
  3. if(preg_match('/<img src=/', $htmlContent))
  4. {
  5.  
  6. $dom = new DOMDocument;
  7. $dom->loadHTML($htmlContent);
  8. foreach($dom->getElementsByTagName('img') as $key => $value)
  9. {
  10. $obr=$value->getAttribute('src');
  11. $value->removeAttribute('width');
  12. $value->removeAttribute('src');
  13. $value->setAttribute('src', 'fotka.php?file='.$obr);
  14. }
  15. $htmlContent=$dom->saveHTML();
  16. echo $htmlContent;
  17. }
  18. ?>



Kod wyświetla zmienione obrazki i to jest ok, ale jak teraz dodać do <img> link, np do oryginalnego obrazu?
Necsord
  1. $element = $dom->createElement('a');
  2. $element->setAttribute('href', 'http://google.pl');
  3. $clone = $image->cloneNode();
  4. $element->appendChild($clone);
  5. $image->parentNode->replaceChild($element, $value);
ShadowD
Ohh, w takim razie wydajność tego rozwiązania w prost boli, @marian84 wchodziłeś na podany link?

Kod
Metoda / iteracje    1    10    100
DOM Document    3.8939    38.4944    399.2282
Wyrażenia regularne    0.0383    0.1597    1.6267


Różnica ~250 razy krotna może warto skorzystać z wyrażeń, przy 2-3 linkach i kilku stronach może to bez sensu, ale jak będziesz wykorzystywał ten kod mocniej na prawdę zastanów się, serwer będzie miał łatwiej, a Ty szybciej. ;-)
zegarek84
Cytat(ShadowD @ 29.01.2012, 12:06:45 ) *
Ohh, w takim razie wydajność tego rozwiązania w prost boli, @marian84 wchodziłeś na podany link?

Kod
Metoda / iteracje    1    10    100
DOM Document    3.8939    38.4944    399.2282
Wyrażenia regularne    0.0383    0.1597    1.6267


Różnica ~250 razy krotna może warto skorzystać z wyrażeń, przy 2-3 linkach i kilku stronach może to bez sensu, ale jak będziesz wykorzystywał ten kod mocniej na prawdę zastanów się, serwer będzie miał łatwiej, a Ty szybciej. ;-)

Właśnie, zależy co dokładnie masz zrobić, nie wszystko można prosto na wyrażeniach regularnych załatwić... a jeśli chodzi o DOM to z każdego z elementów musi powstać obiekt, i te obiekty muszą zostać powiązane w strukturę drzewa (cały dokument), więc co się dziwisz, że wyrażenia regularne tutaj są szybsze?? Poza tym w DOM masz jeszcze wygodę samej modyfikacji drzewa DOM...

Półśrodkiem tutaj gdzie można pokusić się o porównywanie z wyrażeniami regularnymi przy odpowiednim przechodzeniu przez dokument to porównywanie z PHP SAX - ale to musiałbyś umieć sobie ułożyć logikę zdarzeniowo, gdyż nie jest wczytywany dokument w całości. W przypadku PHP, SAX odnosi się do XML Parser
marian84
@ShadowD - zawartość strony i tak wrzucam w cache więc jednorazowe przetworzenie nie wpłynie aż tak na wydajność i obciążenie serwera- ale dzięki za sugestię.
@Necsord- dzięki, wszystko działa jak powinno.
webdice
Cytat(ShadowD @ 29.01.2012, 12:06:45 ) *
Ohh, w takim razie wydajność tego rozwiązania w prost boli, @marian84 wchodziłeś na podany link?

Kod
Metoda / iteracje    1    10    100
DOM Document    3.8939    38.4944    399.2282
Wyrażenia regularne    0.0383    0.1597    1.6267


Różnica ~250 razy krotna może warto skorzystać z wyrażeń, przy 2-3 linkach i kilku stronach może to bez sensu, ale jak będziesz wykorzystywał ten kod mocniej na prawdę zastanów się, serwer będzie miał łatwiej, a Ty szybciej. ;-)


Nie trzeba tego kodu testować, aby stwierdzić że ten test jest z kosmosu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.