Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: preg_match zmiana kolejności tagów html
Forum PHP.pl > Forum > PHP
kebq
witam,

mam przykładowy string z kodem html zawierający podciąg w formie
  1. <p>
  2.  
  3. <img src="bla.png">text text</p>
  4.  


chciałbym wywalić <img> przed <p>

przygotowałem nawet wyrażnie regularne które chyba znośnie łapie mój przypadek:
  1. <p\b[^>]*>[\s]*<img[^>]*>#i

jednak nie mam za bardzo pomysłu jak wyciąć w całości tag <p>, przesunąć za <img> a następnie zwrócić cały html ze zmianami
vermis
Skoro masz wyrażenie które zwraca cały tag img to wytnij go ze stringa źródłowego. I zostają ci 2 stringi. Zapisujesz w odpowiedniej kolejności i już.

Kod
<p\b[^>]*>[\s]*(<img[^>]*>)#i


trzeci parametr preg_match zwróci tablicę, gdzie kolejno będzie cały dopasowany stringi oraz cały tag img
kebq
hm... uściślę trochę

  1. some html code here
  2.  
  3. <h1>foo</h1>
  4.  
  5. <p>
  6.  
  7. <img src="bla.png">text text</p>
  8.  
  9.  
  10. some more html here


chciałbym osiągnąć:
  1. some unchanged html code here
  2.  
  3. <img src="bla.png">
  4.  
  5. <h1>foo</h1>
  6.  
  7. <p>text text</p>
  8.  
  9. some unchanged more html here


nie mam pomysłu jak "przerzucić" np tag h1 nie tracąc treści w nim zapisanej

BTW gdyby dało się lepiej napisać to wyrażenie regularne to też chętnie posłucham

BTW2 preg match zwraca znalezisko plus jeszcze dodatkową liczbę, czym ona jest?
po elementach tablicy lecę za pomocą foreach
vermis
Napisz wyrażenie, które wyciągnie ten fragment:
Kod
<h1>foo</h1>

<p>

<img src="bla.png">text text</p>


Fragment odpowiedzialny za tag img daj w nawiasy.
Trzeci parametr preg_matcha zwróci tablicę.
print_r() wyświetli ci jej zawartość. Powinieneś otrzymać element 0 -> cały fragment, element 1->tag img
Teraz wycinasz z elementu 0 zawartość elementu 1. Teraz tworzysz nowy ciąg czyli img i to co zostało w elemencie 0.
Teraz wystarczy podmienić wszystko w tekście źródłowym.

Można pokusić się o skrócenie kodu i użycie preg_replace().
kebq
co masz dokładnie na myśli mówiąc o wzięciu tagu img w nawias?

problemem jest także to że wcześniej w kodzie znajduje się pusty nagłówek h1 więc go także "łapie"
próbowałem go wykroić za pomocą:
  1. $html = preg_replace("<h1>([\s]*)</h1>", "", $html);

jednak z niewiadomych przyczyn nie łapie tego nagłówka

próbowałem także:
  1. $html = preg_replace("<h1>([\s\t\r\n]*?)</h1>", "", $html);


eksperymentuje też z preg_match_all ponieważ w kodzie jest kilka podobnych fragmentów do edycji, tyle że obrazek otoczony jest dodatkowo np. tagiem strong
Methestel
  1. $text = 'some unchanged html code here
  2. <h1>foo</h1>
  3. <p><img src="bla.png">text text</p>
  4. some unchanged more html here';
  5. $text = preg_replace('/(<.*?)(<img .*?>)(.*>)/si', '$2$1$3', $text);
  6. echo '<pre>';
  7. echo '</pre>';
Osobiście nie polecam jednak tego rozwiązania. Zalecam sparsowanie tego przy pomocy XML Parser. Kod będzie nieco bardziej skomplikowany ale też znacznie bardziej uniwersalny i będziesz miał znacznie większe możliwości modyfikacji XML-a. Będziesz też pewny że dostaniesz w wyniku poprawnego XML-a.
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.