Łamanie tekstu w php z zachowaniem html

0

Witam serdecznie
Mam problem z funkcją do łamania tekstu.

Przykładowo mamy tekst:


<p>Lorem ipsum dolor sit 
<div class="image-container23a41 image-left23a41 image-width-70 reklama_srodtekstowa_sz_1">
   <div class="box10a"> <a class='link_red_font' href="w" class="luk_new_verb_1a" target="_blank"><img src="http://192.168.1.10/ipress/uploads/splash/42141afrtvacekmnprvxajpwz23765475756.01" class="max_img_siz_ob_4 img-responsive reklama_srodtekstowa_sz_1a"/></a></div>
</div>
amet, consectetur adipiscing elit. Nam porta dui quis nisl auctor ultricies. Morbi bibendum nulla magna, a sagittis est placerat ut. In dui eros, vestibulum nec lacinia sit amet, tempor et massa. Proin augue erat, maximus vitae eros non, maximus mattis ipsum. 
<div class="image-container23a41 image-left23a41 image-width-30 reklama_srodtekstowa_sz_1">
   <div class="box10a"> <a class='link_red_font' href="www.wp.pl" class="luk_new_verb_1a" target="_blank"><img src="http://192.168.1.10/ipress/uploads/splash/47572jmvwybdeimnoptxdhnsz22542754184.jpg" class="max_img_siz_ob_4 img-responsive reklama_srodtekstowa_sz_1a"/></a></div>
</div>
Fusce varius congue erat, vitae fringilla metus. Phasellus eu mi sit amet libero posuere eleifend. Suspendisse vestibulum bibendum dolor id auctor. Mauris Fusce varius congue erat, vitae fringilla metus. 
<div class="image-container23a41 image-right23a41 image-width-60 reklama_srodtekstowa_sz_1">
   <div class="box10a"> <a class='link_red_font' href="" class="luk_new_verb_1a" target="_blank"><img src="http://192.168.1.10/ipress/uploads/splash/41703cgimxdhjkmnqrvxcoptz26417064425.01" class="max_img_siz_ob_4 img-responsive reklama_srodtekstowa_sz_1a"/></a></div>
</div>
Phasellus eu mi sit amet libero posuere eleifend. Suspendisse vestibulum bibendum dolor id auctor. Mauris efficitur rhoncus metus accumsan bibendum. Vivamus finibus ultricies orci vel semper. Integer feugiat rutrum placerat. In ornare condimentum urna lacinia finibus. 
<div class="image-container23a41 image-right23a41 image-width-40 reklama_srodtekstowa_sz_1">
<div class="box10a"> <a class='link_red_font' href="www.wp.pl" class="luk_new_verb_1a" target="_blank"><img src="http://192.168.1.10/ipress/uploads/splash/51338cdrswabhkmnpsuwcotxz5690287558.jpg" class="max_img_siz_ob_4 img-responsive reklama_srodtekstowa_sz_1a"/></a></div>

Potrzebuję funkcje która złamie mi tekst np. Po 500 znakach (z uwzględnieniem tagów html).

Dotychczas używałem czegoś takiego:


function trim_text($input, $length, $ellipses = true, $strip_tag = true,$strip_style = true) {
    //strip tags, if desired
    $trimmed_text2 = null;
    if ($strip_tag) {
        $input = strip_tags($input);
    }
 
    //strip tags, if desired
    if ($strip_style) {
        $input = preg_replace('/(<[^>]+) style=".*?"/i', '$1',$input);
    }
 
    if($length=='full')
    {
 
        $trimmed_text=$input;
 
    }
    else
    {
        //no need to trim, already shorter than trim length
        if (strlen($input) <= $length) {
        return $input;
        }
 
        //find last space within length
        $last_space = strrpos(substr($input, 0, $length), ' ');
        $trimmed_text = substr($input, 0, $last_space);
 
        // Zwracamy kolejne XXX znaków
        //$trimmed_text2 = substr($input, $last_space, $length);
 
        $trimmed_text2 = substr($input, $last_space);
 
        //add ellipses (...)
        if ($ellipses) {
        //$trimmed_text .= '...';
        }       
    }
 
    return $trimmed_text."||XXX||".$trimmed_text2;
}

Jednak nie do końca mi to działa sad.gif
Ucina tekst np tak:

<p>Lorem ipsum dolor sit <div class="image-container23a41 image-left23a41 image-width-70 reklama_srodtekstowa_sz_1"> <div class="box10a"> <a class='link_red_font'

I jako kontynuację widzi:

href="w" class="luk_new_verb_1a" target="_blank"><img src="http://192.168.1.10/ipress/uploads/splash/42141afrtvacekmnprvxajpwz23765475756.01" class="max_img_siz_ob_4 img-responsive reklama_srodtekstowa_sz_1a"/></a></div> </div> amet, consectetur adipiscing elit. Nam porta dui quis nisl auctor ultricies……

Chciałbym żeby „łamania” następowały z uwzględnieniem HTML.

Wie ktoś może jak to poprawić?

0

Użyj tego jak wklejasz html'a http://www.freeformatter.com/html-formatter.html albo innego formattera. Zobaczysz od razu że masz bałagan w tagach. I podobnie jak w pierwotnym poscie - doradzę, abyś tego typu operacyje wykonywał za pomocą JS'a, a skoro ma być php' to użyj jakiegoś htmlPurifiera

Kolejna porada - oddając użytkownikowi html'owe pole do klepania tekstu, filtruj jest pod kątem składni (patrz wyżej ^ htmlPurifier)

0

dziękuje za uwagę. Możesz polecić jakiś skrypt do czegoś takiego?

0

Jeszcze jedno pytanie, które powinieneś zadać najpierw sobie.
Mając np taki kod

 <div class="a">
    <p>A to jest mój długi tekst</p>
    <table>.....</table> 
    <p>A to jest mój jeszcze dłuższy tekst</p> 
    <span data-description="Jakiś opis mniej znaczący niż poprzednie"><i class="fa fa-php"></i>http://www.mojbardzodlugiurlktoryniemozezostacskrocony</span>
</div>

To mając załozenie że tekst ucinasz przy np 10 znakach, to jak by to miało wyglądać w tym przypadku? Co należy uciąć? Jak miałby wyglądać tekst wynikowy?

0

Dobre pytanie... Jak Twoim zdaniem najepiej zro zrobić? U Mnie w kodzie są tylko obrazki i text w sumie

0

Jak w takim przypadku najlepiej "wypełnić" pola tekstem znajdującym się w różnych obszarach strony?

0

Przede wszystkim ograniczyć uzytkownikom możliwości formatowania np tylko do tagów <p> / <h1>-<h6> / <img> oraz <ul> / <ol>. Następnie powinna następować weryfikacja czy podany kod jest poprawny, abyś nie miał kwiatków w stylu

 <a href="#"> </p><b></table> </b> </a></a>

Dodatkowo ucinałbym wszystkie atrybuty z wyjątkiem hrefa w a i src w img.

Następnie - jeśli teksty są przydługie ucinać je za pomocą JS'a, robienie tego po stronie php chyba mija się z celem i wymagałoby na serio dużego nakładu pracy.
W cssie - należałoby nadać konkretne klasy dla kontenerów tych danych, oraz przygotować style pod konkretne możliwe do użycia tagi.

Sugestia: jeśli chcesz dać użytkownikom możliwość formatowania tekstu - to może posłuż się BBCode'm? Jeśli masz wydzielone sekcje np nagłówek, miniaturka, stopka itp itd - to może jednak lepiej pokusić się o kilka inputów dla użytkownika?

Poniżej masz przykład złych danych jakie może Ci wklepać user

<p>To jest mój paragraf</p>
<p style="font-size:24px">A to drugi paragraf</p>
<a href="#" style="letter-spacing:20px;">Link do strony</a>

Wklej to jakiegoś parsera online i zobacz jakie będziesz miał wyniki wizualne, a przecież jak widać teksty zawarte w tagach nie są jakoś dlugie.

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