Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ucinanie stringu a tagi HTML
Forum PHP.pl > Forum > PHP
termin
Witam, uzywam FCKeditor i jego wyniki zapisuje w bazie danych. Problem polega na tym ze ucięcie stringa po 400 znakach w systemie NEWS, nieraz obetnie w miejscu gdzie nie ma zamknięcia taga, a co za tym idzie to wiadomo. Wyprobowałem kilkanaście skrytow znalezionych w internecie, lecz zaden nie działa jak należy. Zazwyczaj znalezione skrypty dotyczyły BBcode, czy ma ktoś z Was rozwiązanie z uwzględnieniem tagów HTML?
mokry
Ja osobiście używam u swoich klientów w systemach newsów małego zabiegu. News'a dziele na dwie części w tabeli: lead i body. Lead wyświetlany jest na liście newsów a body przy widoku rozszerzonym. Nie trzeba wtedy kombinować z zamykaniem tagów.
Jeśli jednak koniecznie chcesz korzystać z substr to proponuję najpierw tekst przelecieć przez strip_tags a potem substr, ale przez to stracisz całkowicie formatowanie tekstu... Całość wrzucasz tylko do jednego <p />
Kicok
  1. <?php
  2.  
  3.  
  4. $text = "
  5. <div> sadsad </div>
  6. <div> 
  7. <div> 
  8. fds asfsa 
  9.  
  10. <p> 
  11. asfs
  12. </p>
  13.  
  14. </div>
  15. asd 
  16. </div> 
  17.  
  18. dsfds 
  19. <b> <i> asfsdf</b> </i> 
  20. dsf
  21.  
  22. <p>
  23. <p>
  24. <b><span class=\"whatever\"><i> dsfdsfdsg <br /> <br> dgdg dsg sd sd sdg g </b> ddsf <u> d d";
  25.  
  26.  
  27.  
  28. // Wyciągamy tagi otwierające i zamykające
  29. preg_match_all( "#<([a-z0-9]+)(?snitch.gif|s[^>]*[^/]>)#si", $text, $open );
  30. preg_match_all( "#</([a-z0-9]+)(?snitch.gif|s[^>]*>)#si", $text, $close );
  31.  
  32.  
  33. // Zamieniamy wszystkie nazwy tagów na pisane małymi literami
  34. $open[1] = array_map( 'strtolower', $open[1] );
  35. $close[1] = array_map( 'strtolower', $close[1] );
  36.  
  37.  
  38. // Wywalamy z tablicy tagów otwierających te, które nie wymagają zamykania
  39. function dontClose( $var )
  40. {
  41. static $tags = array( "br", "hr" );
  42.  
  43. return !in_array( $var, $tags );
  44. }
  45.  
  46. $open[1] = array_filter( $open[1], "dontClose" );
  47.  
  48.  
  49. // Wywalamy z tablicy tagów otwierających te, które są już zamknięte
  50. function tagDiff( $open, $close )
  51. {
  52. foreach( $open as $key => $item )
  53. {
  54. $key2 = array_search( $item, $close );
  55. if( $key2 !== false )
  56. {
  57.  
  58. unset( $open[$key] );
  59. unset( $close[$key2] );
  60. }
  61. } 
  62.  
  63. return $open;
  64. }
  65.  
  66. $open[1] = tagDiff( $open[1], $close[1] );
  67.  
  68.  
  69. // Zamieniamy kolejność tagów do zamknięcia
  70. $open[1] = array_reverse( $open[1] );
  71.  
  72.  
  73. // Zamykamy otwarte tagi
  74. $text .= "r\n</" . implode( ">r\n</", $open[1] ) . ">";
  75.  
  76.  
  77.  
  78. echo $text;
  79.  
  80. ?>
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.