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ólnego z "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 "ó".
Dziękuję.