• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dziwne zachowanie funkcji "htmlentities".

Object Storage Arubacloud
0 głosów
935 wizyt
pytanie zadane 30 grudnia 2016 w PHP przez Klik Obywatel (1,540 p.)
otagowane ponownie 30 grudnia 2016 przez Klik

Witam. Zauważyłem dziwne zachowanie tej funkcji podczas walidacji tekstu i nie bardzo mogę zrozumieć dlaczego tak się dzieje. I teraz do opisu problemu.

W klasie "article" mam metodę zwracającą treść artykułu i metodę przycinającą treść (jeśli istnieje potrzeba wyświetlenia tylko części artykułu).

//$trim - ilość znaków do wyświetlenia
//$end - zakończenie tekstu po przycięciu ("...", "czytaj dalej" itp.)
public function getContent($trim = null,$end = null){
        if($trim!=null) {
            return $this->trimText($trim,$this->content,$end);
        }
        return $this->content;

    }

//funkcja przycinająca

private function trimText($trim,$text,$end){
        $textLength = strlen($text);
        if($textLength<=$trim){
            return $text;
        }else{
            $cutText = substr($text,0,$trim);
            $trimmedText = $cutText.$end;
            return $trimmedText;
        }
    }

 

Dla każdej strony z artykułem jest generowany nowy meta tag "description" i "title".

Tag "description" jest generowany z treści artykułu i ma długość 70 znaków.

Jako że w treści mogą znaleźć się tagi html lub cudzysłowy a które są niepotrzebne w tagu Meta to usuwam je za pomocą funkcji strip_tags i htmlentities. Kod poniżej.

$desc = $this->article->getContent(70);
$this->meta->setMeta('desc',htmlentities(strip_tags($desc),ENT_QUOTES,'UTF-8'));

 

I teraz pojawia się problem. Przy ustaleniu liczby znaków na 70 okazało się że w jednym z artykułów ostatni znak wypada na literce "ą".

Treść w bazie danych:

<p>Jej zdaniem sytuacja nie ma nic wspólnego z "rzeczywistą kondycją

 

Bez użycia funkcji "htmlentities" treść html wygląda tak:

<meta name="description" content="Jej zdaniem sytuacja nie ma nic wspólnego z "rzeczywistą kondycj�">

A po użyciu funkcji "htmlentities" zawartość znika.

<meta name="description" content="">

Jeśli zwiększę ilość znaków do 71 to problem znika.

<meta name="description" content="Jej zdaniem sytuacja nie ma nic wsp&oacute;lnego z &quot;rzeczywistą kondycją">

Ale jeśli w kodzie na sztywno wpiszę stringa do walidacji to problem nie występuje. Dlaczego tylko po pobraniu z bazy danych jest ten problem?

$this->meta->setMeta('desc',htmlentities(strip_tags('<p>Jej zdaniem sytuacja nie ma nic wspólnego z "rzeczywistą kondycją'),ENT_QUOTES,'UTF-8'));

Mam nadzieję że wyjaśniłem odpowiednio problem.

Czy ktoś może mi wytłumaczyć dlaczego tak się dzieje? I jakie jest remedium na ten problem jeśli ostatnią literką jest polski znak? I dlaczego literka "ó" jest pokazana jako "&oacute;".

Dziękuję.

2 odpowiedzi

+1 głos
odpowiedź 31 grudnia 2016 przez maly Nałogowiec (37,190 p.)
wybrane 31 grudnia 2016 przez Klik
 
Najlepsza
Nie strlen tylko mb_strlen.
Nie substr tylko mb_substr.
I ogólnie dla tekstów używaj funkcji z rodziny multibyte string(mb_blabla).
komentarz 31 grudnia 2016 przez Klik Obywatel (1,540 p.)
Bardzo dziękuję. Resztę już sobie na wygooglałem. :)

Pozdrawiam
0 głosów
odpowiedź 30 grudnia 2016 przez grollajt Bywalec (2,860 p.)
1. przy dodawaniu do bazy zamiast htmlentities uzyj mysqli_real_escape_string()  <-bo rozumie ze to chodzi tylko by do bazy sie nie wladowaly szkodliwe znaki .

2.upewnij sie ze kodowanie w bazie masz ok.

To powinno zalatwic problem
komentarz 30 grudnia 2016 przez Klik Obywatel (1,540 p.)
Przecież ja pobieram z bazy a nie dodaję.
komentarz 30 grudnia 2016 przez Klik Obywatel (1,540 p.)
Czytałeś mój pierwszy post? Jeśli nie, to zapytam w ten sposób. Jak usunąć ten znak ".
komentarz 30 grudnia 2016 przez grollajt Bywalec (2,860 p.)
edycja 30 grudnia 2016 przez grollajt
Ok teraz doczytalem pytanie.
1. dlaczego literka "ó" jest pokazana jako "&oacute; <- htmlentities zmienia "dziwne" znaki na encje sym­bo­liczna(znalazlem na necie nazwe)
Tobie tak na stronie pokazuje?
2. jakie jest remedium na ten problem <- ucina ci cos za wczesnie. wyglada to tak jakbys uzywal pierwsze htmlentities a dopiero pozniej ucinal chociaz jesli dobrze rozumie to kod mowi cos innego
Jak robisz mete w html, twig czy co tam uzywasz?
komentarz 30 grudnia 2016 przez Klik Obywatel (1,540 p.)

Zamiast "htmlentities" użyłem"htmlspecialchars" i z "ó" problemu nie ma. Jednak dalej występuje ten problem, że po pobraniu 70 znaków, ostatni znak który powinien widnieć jako ą, jest widoczny jako: �. I to bez stosowania jakiejkolwiek funkcji czyszczącej na wyjściu.

<meta name="description" content="Jej zdaniem sytuacja nie ma nic wspólnego z "rzeczywistą kondycj�">

Nie rozumiem dlaczego 'ą' jest widoczne dopiero po pobraniu 71 znaków.

Żadnego twig nie używam sam sklecam kod od 0.

komentarz 30 grudnia 2016 przez grollajt Bywalec (2,860 p.)

tak dla sprawdzenia zamien to:
 

$this->meta->setMeta('desc',htmlentities(strip_tags($desc),ENT_QUOTES,'UTF-8'));


Na to:

$this->meta->setMeta('desc',htmlentities(strip_tags('Jej zdaniem sytuacja nie ma nic wspólnego z "rzeczywistą kondycją'),ENT_QUOTES,'UTF-8'));


 

komentarz 30 grudnia 2016 przez Klik Obywatel (1,540 p.)
Też pisałem w pierwszym poście że jeśli tekst dodam bezpośrednio w kodzie to działa bez problemu.
komentarz 30 grudnia 2016 przez grollajt Bywalec (2,860 p.)
przed $this->meta->setMeta('desc',htmlentities....
zrob var_dump($desc);
i podaj co ci  zwroci

Podobne pytania

0 głosów
2 odpowiedzi 132 wizyt
pytanie zadane 4 lutego 2017 w JavaScript przez niezalogowany
0 głosów
1 odpowiedź 153 wizyt
pytanie zadane 17 lutego 2018 w PHP przez shy_fox Gaduła (4,320 p.)
0 głosów
1 odpowiedź 484 wizyt
pytanie zadane 2 kwietnia 2016 w PHP przez GaCeL Dyskutant (7,500 p.)

92,581 zapytań

141,433 odpowiedzi

319,666 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...