Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Formatowanie HTML
Forum PHP.pl > Forum > PHP
.radex
Chcę zrobić skrypt edycji plików na serwerze... I jak zrobić coś takiego że jak wczytam to w textarea pokaże mi się formatowany kod. mam na myśli coś takiego:

Przykładowy kod źródłowy
  1. <table><tr><td width="200">Rameczka</td></tr></table>


I ma wyjść coś takiego:

  1. <tr>
  2. <td width="200">
  3. Rameczka
  4. </td>
  5. </tr>


A po zapisaniu znowu kompresja
SongoQ
Liczysz zagniezdzenie elementow (<...) i w zaleznosci ile ich jest tyle wstawiasz spacji.
.radex
Hmmm... To dobry pomysł. Nie wiem tylko jak się za to zabrać.

Pętle się chyba przydadzą i coś aby znaleść HTML ( Szukanie pomiędzy <x> a </x> i jakoś rozróżnienie jeśli coś będzie po x np. width="200". I potem z liczam i szukanie wstawiam na tym samym poziomie, np.
  1. ...
  2. Tekst
  3. </table>


Pozornie proste ale niech ktoś mi podpowie jak sie za to zabrać...
Jim
siedze nad tym już kilka godzin dry.gif i nie moge dopasować wyrażenia, ale schemat mam taki:

Kod
$s = '<table><tr><td width="200">Rameczka</td></tr></table>';

function doIt($str) {
  print_r($str);
//   static $level;
//   if (!isset($level)) $level = 0;
  
//  if ( $str[1] != $str[4] ) return $str[1];
  
//   $offset = '';
//   for ( $i=0; $i<=$level; $i++)
//     $offset .= '  ';
  
  return "\n  <".$str[1]." ".$str[2].">\n    ".$str[3]."\n  </".$str[4].">";
}

echo preg_replace_callback('#<(.*?)\s(.*?)>(.*?)</(.*?)>#si', 'doIt', $s);


próbowałem złapać <(tag)(opcjonalnie spacja i atrybuty)>(zawartosc)</(tag)> i jeżeli pierwszy tag == ostatni tag to wtedy następuje zagnieżdżenie



update:
inaczej to ugryzłem
  1. <?php
  2.  
  3. $s = '<table><tr><td width="200">Ot,<br />Rameczka</td></tr></table>';
  4. function doIt($str) {
  5. static $level;
  6. static $lastTag;
  7.  
  8. if (!isset($level)) $level = -1;
  9.  
  10. if ($str[1]{strlen($str[1])-1} != '/') {
  11. // jeżeli aktualny tag nie jest pojedyńczym tagiem (np. <br />)
  12.  
  13. if ( (strpos($lastTag,substr($str[1],2)) == FALSE) ) {
  14. // jeżeli poprzedni tag jest różny od aktualnego
  15.  
  16. if ( $str[1]{0}=="/" ) {
  17. // jeżeli aktualny tag jest zamykający
  18. $level--;
  19. } else {
  20. $level++;
  21. }
  22. }
  23. // zapamiętuję aktualny tag
  24. $lastTag = $str[1];
  25. }
  26.  
  27. // odpowiednia ilośc spacji
  28. $offset = '';
  29. for ( $i=0; $i<$level; $i++)
  30. $offset .= ' ';
  31.  
  32. return "n".$offset.$str[0]."n".$offset." ";
  33. }
  34.  
  35. echo preg_replace_callback('#<(.+?)>#si', 'doIt', $s);
  36. ?>


(BTW: może mi ktoś wytłumaczyć dlaczego kolorowanie składni forum dodaje \ przed " oraz usuwa \ przed n?)

i to wyrzuci
Kod
<table>
  
  <tr>
    
    <td width="200">
      Ot,
    <br />
      Rameczka
    </td>
      
  </tr>

    
</table>

uwaga! produkt nieprzetestowany we wszystkich wypadkach. cool.gif
NuLL
Cytat
(BTW: może mi ktoś wytłumaczyć dlaczego kolorowanie składni forum dodaje \ przed " oraz usuwa \ przed n?)

OT - zamykaj regularki w znacznik [code] - problem znika - tak na przyszlosc smile.gif
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.