[PHP] Usuwanie istniejących znaczników HTML

0

Witam.

Od kilku dni walczę z jedną, wydawało by się, prostą sprawą (nie wykluczam, że taka jest :P).
Uprzedzam tylko, że będę obrabiał tekst wpisany przez użytkowników, więc treści mogą być różne.

W każdym razie, muszę usunąć wszystkie znaczniki (tagi) HTML z tekstu, z wyjątkiem kilku wybranych.

Wiem, znam strip_tags, fajnie można tam ustawić wyjątki, ale ta funkcja ma swoją wielką wadę.
Mianowicie nie sprawdza czy usuwany tag, w ogóle istnieje. Usuwa wszystko pomiędzy < a >.
Czyli jeżeli napisałbym coś takiego:
"x jest zawsze<0. Oczywiście czasem są wyjątki, ale prawie się nie zdarza, aby x bylo>0. Wiem głupie to:P"
W takim przypadku, wbudowana funkcja usunie całą podkreśloną treść.

Macie jakiś sposób, aby poprawić tę niedogodność?
Próbowałem coś wykombinować z wyrażeniami regularnymi, ale udawało mi się tylko osiągnąć takie samo działanie jak strip_tags.

Pozdrawiam.:)

0

A konkretniej?
Wiem jak usunąć tekst ze stringa, jak mówiłem udało mi się to zrobić nawet poprzez wyrażenia regularne.
Natomiast chciałbym wiedzieć, czy będę zmuszony "ręcznie" wszystko oprogramować i definiować wszystkie możliwe tagi HTML, czy może jest jakiś inny prostszy/gotowy sposób?

0

ugr... a konkretnie to zajrzyj do google bo sprawiasz nieodparte wrażenia gościa który czeka na gotowca...

0
div 1024 napisał(a)

a konkretnie to zajrzyj do google

Dzięki, ale nie potrzebuję Twojego pozwolenia, żeby odpalić sobie google.

Szukałem już i mówiłem, że umiem podmienić łańcuchy.

div 1024 napisał(a)

bo sprawiasz nieodparte wrażenia gościa który czeka na gotowca...

Jakbyś doczytał mojego posta do końca, a nie poprzestał na 2 pierwszych słowach, byś wiedział z czym mam problem:

Pik napisał(a)

chciałbym wiedzieć, czy będę zmuszony "ręcznie" wszystko oprogramować i definiować wszystkie możliwe tagi HTML, czy może jest jakiś inny prostszy/gotowy sposób?

Nawet nie prosiłem o żaden fragment kodu.
Jako "gotowy sposób" miałem na myśli jakąś wbudowaną funkcję PHP, o której jeszcze nie wiem.

0

ok ok, spokojnie, może powinienem się zachować inaczej... ;-)

A wracając do tematu: pisząc "ręcznie oprogramować" masz na myśli to że będziesz musiał ręcznie wklepywać wszystkie tagi html ? hmm no, teoretycznie tak ale na http://pl.php.net/strip_tags w komentarzach masz funkcje strip_selected_tags, nazwa mówi sama za siebie. Looknij na nią może warto ale powiem szczerze nie chciało mi sie już jej sprawdzać (patrz godzina pisania postu).
Daj znać jak coś z tego wyjdzie.

0

[Treść z 04-02-2009 02:29]
Po wstępnym przyjrzeniu się, wygląda na to, że faktycznie ta funkcja przy "wbiciu" wszystkich tagów byłaby idealna.
Tylko właśnie chciałbym tego wklepywania uniknąć.
Ale jeżeli nie ma wyjścia, to to zrobię, w końcu nie jest to niewykonalne.:P

Dzięki.:)

[Dopisane 04-02-2009 14:00]
Zmodyfikowałem tamtą, podaną przez Ciebie, funkcję.
Dodałem usuwanie komentarzy HTML oraz poprawiłem błąd, przez który wszystkie nie zamknięte znaczniki nie były usuwane (a przecież nie każdy tag wymaga zamknięcia, np.
nie ma </br> :-) )

function strip_exists_tags($text, $allowedTags = array())
{
  $tags2strip = array('!--.*--', '!DOCTYPE', 'a', 'abbr', 'acronym', 'address', 'applet', 'area', 'b',   'base', 'basefont', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'cite',
  'code', 'col', 'colgroup', 'dd', 'del', 'dfn', 'dir', 'div', 'dl',   'dt', 'em', 'fieldset', 'font', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'html', 'i', 'iframe',
  'img', 'input', 'ins', 'isindex', 'kbd', 'label', 'legend', 'li', 'link', 'map', 'menu', 'meta', 'noframes', 'noscript', 'object', 'ol', 'optgroup', 'option', 'p', 'param', 'pre', 'q', 's', 'samp', 'script',
  'select', 'small', 'span', 'strike', 'strong', 'style', 'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'tt', 'u', 'ul', 'var');

  $args = func_get_args();
  $text = array_shift($args);
  $allowedTags = func_num_args() > 2 ? array_diff($args,array($text))  : (array)$allowedTags;  
  foreach ($tags2strip as $tag)
  {  
    if (!in_array($tag, $allowedTags))
      while(preg_match('/<\/?'.$tag.'(|\W[^>]*)>/iusU', $text, $found))
        $text = str_replace($found[0],$found[2],$text);
  } 

  return preg_replace('/(<\/?('.join('|',$tags2strip).')(|\W.*)\/>)/iusU', '', $text);
}

Jest tylko jeszcze problem, z którym nie mogę sobie poradzić.
Chociaż jeden polski znak w tekscie powoduje zwrócenie pustego rezultatu.
Prawdopodobnie coś jest z tamtymi wyrażeniami, ale nie mogę dojść do tego, w którym miejscu.
Funkcja tak samo się zachowuje, przy znakach: '&' i '#'.
Co jest nie tak? :-/

1 użytkowników online, w tym zalogowanych: 0, gości: 1