Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Funkcja zamykająca tagi HTML
Forum PHP.pl > Forum > PHP
ladovnik
Witam. Potrzebuję funkcji, która będzie w podanej zmiennej zamykała otwarte, lecz nie zamknięte tagi HTML. Udało mi się coś takiego zrobić, lecz moja funkcja po prostu na końcu zmiennej dodaje brakujące zamknięcia, co zazwyczaj jest niezgodne z W3C (a musi być). Funkcja powinna zamykać dany tag przed pojawieniem się następnego tagu, np. gdy do funkcji wprowadzimy kod:
Kod
<B>Witam! Zapraszam na moją stronę o <U>grach, jest ona <I>najlepsza!</I>

To funkcja powinna zwrócić:
Kod
<B>Witam! Zapraszam na moją stronę o </B><U>grach, jest ona </U><I>najlepsza!</I>

Liczy się, aby było to zgodne z W3C.

Prezentuję poniżej kod mojej funkcji i mam nadzieję, że komuś z Was przyjdzie do głowy jak naprawić ten problem.

  1. function repair_html($str) {
  2. # Define arrays
  3. $tags_open=Array('<b>','<i>','<u>','<a','<p');
  4. $tags_close=Array('</b>','</i>','</u>','</a>','</p>');
  5. $tags_open_num=Array();
  6. $tags_close_num=Array();
  7. $tags_status=Array();
  8.  
  9. # Count opened tags
  10. foreach($tags_open as $id => $tag) {
  11. $tag_big=strtoupper($tag);
  12. $tag_small=strtolower($tag);
  13. $count_big=substr_count($str,$tag_big);
  14. $count_small=substr_count($str,$tag_small);
  15. $count=$count_big+$count_small;
  16.  
  17. $tags_open_num[$id]=$count;
  18. }
  19.  
  20. # Count closed tags
  21. foreach($tags_close as $id => $tag) {
  22. $tag_big=strtoupper($tag);
  23. $tag_small=strtolower($tag);
  24. $count_big=substr_count($str,$tag_big);
  25. $count_small=substr_count($str,$tag_small);
  26. $count=$count_big+$count_small;
  27.  
  28. $tags_close_num[$id]=$count;
  29. }
  30.  
  31. # Count opened but not closed tags
  32. foreach($tags_open as $id => $tag) {
  33. $no_closed=$tags_open_num[$id]-$tags_close_num[$id];
  34. $tags_status[$id]=$no_closed;
  35. }
  36.  
  37. # Close not closed tags
  38. foreach($tags_open as $id => $tag) {
  39. $status=$tags_status[$id];
  40. echo '<b>Status tagu '.htmlspecialchars($tag).' to '.$status.'</b><BR>';
  41. if($status>0) {
  42. $opened_num=$tags_open_num[$id];
  43. echo '- Liczba otwartych tagow: '.$opened_num.'<BR>';
  44. $close_tag=$tags_close[$id];
  45. echo '- Tag zamykajacy: '.htmlspecialchars($close_tag).'<BR>';
  46. for($i=$status;$i<=$opened_num;$i++) {
  47. $str.=$close_tag;
  48. }
  49. }
  50. }
  51.  
  52. return $str;
  53. }
  54.  
  55. $html='<b>Witam! Co tam u ciebie? Ja <i> nic nie robię!';
  56. $html_new=repair_html($html);
  57.  
  58. echo 'Stary kod:<BR>';
  59. echo '<textarea rows="10" cols="100">'.$html.'</textarea><BR>';
  60.  
  61. echo 'Nowy kod:<BR>';
  62. echo '<textarea rows="10" cols="100">'.$html_new.'</textarea><BR>';


Pozdrawiam,
ladovnik

PS To "echo '<b>Status tagu..." itp. jest tylko do testów i wykrywania błędów.
ladovnik
Niestety, tamta funkcja robi to samo co moja - dodaje tagi zamykające na samym końcu ciągu sad.gif
erix
Wysiliłbyś się chociaż przejrzeć całą tamtą stronę, a nie tylko to, co Ci palcem pokażą...
ladovnik
Owszem, sprawdziłem. Poza tą funkcją, którą wskazałeś, żadna inna nie zamyka tagów (wszystkie potencjalne testowałem). Możliwe jednak, że coś przeoczyłem, dlatego jeśli znalazłeś tam jakaś funkcję poprawnie działającą to z łaski swojej podpowiedz mi która to winksmiley.jpg
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.