Kako očistiti tekst od nepoželjnih tagova i skratiti ga po potrebi - tutorijal

1

Kako očistiti tekst od nepoželjnih tagova i skratiti ga po potrebi - tutorijal

offline
  • Web Designer, PHP Developer; HTML, CSS, SQL, jQuery Programmer
  • Pridružio: 13 Jun 2010
  • Poruke: 307
  • Gde živiš: Subotica

Evo jedna moja mala skriptica koju koristim kada radim CMS sisteme. Ova skripta ima "moć" da ukloni nepoželjne tagove u toku kopiranja teksta preko nekih WYSIWYG editora. Opšte je poznato da ovi editori kupe i potrebne i nepotrebne HTML kodove i fajlove koji "prljaju" vaš kod i stranica ume bukvalno da se raspadne.

Druga stvar je kada imate izlistavanje teksta pa je problem uvod. E sada da uštedite pravljenje tabele u SQL-u za uvodni tekst koristite jedan skratilac koji skrati tekst sadržaja na određen broj karaktera.

GLAVNI KOD
// Čistač svih HTML tagova function cleen_html($content, $html) { $content = preg_replace(    array('@<body[^>]*?>.*?</body>@siu','@<head[^>]*?>.*?</head>@siu','@<style[^>]*?>.*?</style>@siu','@<script[^>]*?>.*?</script>@siu','@<object[^>]*?>.*?</object>@siu','@<applet[^>]*?>.*?</applet>@siu','@<noframes[^>]*?>.*?</noframes>@siu','@<noscript[^>]*?>.*?</noscript>@siu','@<noembed[^>]*?>.*?</noembed>@siu','@</?((address)|(blockquote)|(center)|(del))@iu','@</?((div)|(h[1-9])|(ins)|(isindex)|(p)|(pre))@iu','@</?((dir)|(dl)|(dt)|(dd)|(li)|(menu)|(ol)|(ul))@iu','@</?((table)|(th)|(td)|(caption))@iu','@</?((form)|(button)|(fieldset)|(legend)|(input))@iu','@</?((label)|(select)|(optgroup)|(option)|(textarea))@iu','@</?((frameset)|(frame)|(iframe))@iu'),array(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', "$0", "$0", "$0", "$0", "$0", "$0","$0"), $content );     $content=strip_tags($content, $html);   return $content; } // Skratilac teksta function strip($content, $num) {    $content_strip = substr($content,0,$num);    if(strlen($content)>=$num){$cleen=$content_strip.'...';}    else{$cleen=$content;}    return $cleen; }

E sada dolazi zanimljiv deo...
Kada treba da očistite sadržaj imate potpunu slobodu da zabranite sve HTML tagove ili da dozvolite da se ipak određeni pojavljuju.

$content='Ovaj tekst<div>tekst</div> je probni <br/> koji ima za <strong>cilj</strong> da prikaže <p>opciju</p> koji ovaj kod <i>pruža</i>.'; // zabranjuje sve HTML tagove echo cleen_html($content, ''); // dozvoljava samo određene HTML elemente (<br><p><strong>) echo cleen_html($content, '<br><p><strong>');

Drugo je skratilac ovde samo ubacite tekst i odredite broj karaktera

$content='Ovaj tekst<div>tekst</div> je probni <br/> koji ima za <strong>cilj</strong> da prikaže <p>opciju</p> koji ovaj kod <i>pruža</i>.'; // očisti tekst $content=cleen_html($content, ''); // skrati tekst echo strip($content, 20); // ili optimizovana verzija echo strip(cleen_html($content, ''), 20);

I to je to... Isprobajte i uživajte. Ako treba još neki tutorijal ili pomoć, pitajte...



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 16 Jan 2010
  • Poruke: 241
  • Gde živiš: Zemun

Hvala za funkciju za čišćenje teksta.

Evo jednog jednostavnog saveta za skraćivanje teksta, PHP u svojoj biblioteci ima funkciju koja se zove substr_replace (link: http://php.net/manual/en/function.substr-replace.php), koja može veoma lako da skrati tekst.

substr_replace ( mixed $string , mixed $replacement , mixed $start [, mixed $length ] );

Što u praksi izgleda ovako:

echo substr_replace("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras tincidunt aliquam magna id gravida. Nulla facilisi. Morbi suscipit sagittis enim lobortis commodo. Aenean sagittis volutpat rutrum. Duis ante neque, consectetur eget fringilla ut, suscipit eget quam. Suspendisse arcu risus, aliquam quis gravida sit amet, euismod quis libero. Ut pretium pulvinar molestie. Nam aliquet ultrices nulla in porta. Vestibulum ut purus vitae orci congue vestibulum. Etiam eget enim ac nisl malesuada ultrices nec in dolor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas..", "...", 100)

Rezultat:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras tincidunt aliquam magna id gravida. Nu...



offline
  • Web Designer, PHP Developer; HTML, CSS, SQL, jQuery Programmer
  • Pridružio: 13 Jun 2010
  • Poruke: 307
  • Gde živiš: Subotica

Hm... Ovo nisam koristio... Super je... Hvala!

offline
  • arnage 
  • Novi MyCity građanin
  • Pridružio: 13 Feb 2013
  • Poruke: 16

Evo jos jednog nacina za skracivanje teksta sa tri tacke ili bez:

function cutout($string, $howmuch, $etc = false) {     return mb_strlen($string, 'UTF-8') > $howmuch      ? mb_substr($string, 0, $howmuch, 'UTF-8').($etc !== false ? '...' : '')     : $string; }

Upotreba sa tri tacke:

$string = 'Some too long string'; $string = cutout($string, 10, true); echo $string; //Some too l...

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3747
  • Gde živiš: 127.0.0.1

Mnogo volem ljude koji su voljni da izmisljaju toplu vodu. PHP ima built-in funkciju koja se zove strip_tags() i cija je funkcionalnost upravo ta - da obrise nepozeljne (ili sve) html tagove.

Description ::string strip_tags ( string $str [, string $allowable_tags ] )

Ne treba napominjati da su sve built-in PHP funkcije brze od bilo koji definisanih od strane korisnika.

offline
  • arnage 
  • Novi MyCity građanin
  • Pridružio: 13 Feb 2013
  • Poruke: 16

Najcesce ali ne bukvalno uvek. Smile

Na primer mana ucfirst() bult in funkcije se resava sa:

function utf8_ucfirst($string) { return mb_strtoupper(mb_substr($string, 0, 1, 'UTF-8'), 'UTF-8').mb_strtolower(mb_substr($string, 1, mb_strlen($string, 'UTF-8') - 1, 'UTF-8'), 'UTF-8'); }

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3747
  • Gde živiš: 127.0.0.1

@arnage: kad god postoji PHP f-ja koja radi isto to - cemu izmisljanje tople vode? Gubis na brzini, taman da je uradis 100% kako treba (a to znaci da pokrijes sve moguce varijante - sto je nemoguce).

Sa druge strane - ova tvoja implementacija ucfirst() funkcije nije ispravna. Zasto? Zasto sto tvoja varijanta vraca string sa velikim prvim slovom i ostalim malim slovima (lowercase), sto nije u skladu sa ucfirst() koja vraca prvim velikim i ostalim nepromenjenim slovima.

ucfirst ::Returns a string with the first character of str capitalized, if that character is alphabetic.

<?php $foo = 'hello world!'; $foo = ucfirst($foo);             // Hello world! $bar = 'HELLO WORLD!'; $bar = ucfirst($bar);             // HELLO WORLD! $bar = ucfirst(strtolower($bar)); // Hello world! ?>

Neslaganje sa tvojom funkcijom @arnage je u svim sledecim karakterima od drugog na dalje. Primer:
<?php echo ucfirst('ЋИРИЛИЦА'); // ЋИРИЛИЦА (true) echo utf8_ucfirst('ЋИРИЛИЦА'); // Ћирилица (false) echo ucfirst('LATINICA'); // LATINICA (true) echo utf8_ucfirst('LATINICA'); // Latinica (false) ?>

Ispravna implementacija bi bila:

function utf8_ucfirst($string) {         return mb_strtoupper(mb_substr($string, 0, 1, 'UTF-8'), 'UTF-8'). mb_substr($string, 1, null, 'UTF-8'); }

jer tako vraca string sa pocetnim velikim slovom, i ostalim nepromenjenim.

Inace, APSOLUTNO SVE built-in PHP funkcije su brze od bilo kakve implementacije u PHP-u, pa makar implementacija bila identicna, ako ni zbog cega drugog - ono zbog vremena potrebnog da se PHP kod kompajlira prilikom pokretanja.

offline
  • arnage 
  • Novi MyCity građanin
  • Pridružio: 13 Feb 2013
  • Poruke: 16

Moja greska, u brzini sam pastovao pogresnu funkciju ali svodi se na isto, a ti nisi razumeo kakav je problem u pitanju. Smile

Radi se o multibyte.

echo ucfirst('äåÖäÄ'); // äåÖäÄ

Moje (tvoje modifikovano) resenje:
echo utf8_ucfirst('äåÖäÄ'); // ÄåÖäÄå

Vidis? Smile Ne radi se o brzini.

Ali lepo primeceno. Wink

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3747
  • Gde živiš: 127.0.0.1

Moj komentar (onaj o brzini) se prvenstveno odnosi na prvi post u ovoj temi. Tek sad je videh Wink Malo teze da sam posle sasvim dovoljno godina iskustva pogresno protumacio jednu liniju koda Mr. Green

Drugo - "cut-out" f-je imaju nesto duzu implementaciju da bi se izbeglo secenje u sred reci - tj da ne bi doslo do "Lorem ip..." umesto "Lorem ipsum..." (prilikom skracivanja "Lorem ipsum dolor sit amet" na 8 slova).

Nesto ovako (pisano iz glave):

function mb_cutout($str, $len, $etc = '...') {    if (mb_strlen($str) <= $len || mb_strpos($str,' ',$len) > mb_strlen($str))    {       return $str;    }    else    {       return mb_substr($str, 0, mb_strpos($str,' ',$len)) . ($etc ? $etc : '');    } }

offline
  • arnage 
  • Novi MyCity građanin
  • Pridružio: 13 Feb 2013
  • Poruke: 16

Necemo o iskustvu. Wink A meni si podvlacio i boldirao te reci...

Nebitno ko je sta razumeo, a sta nije, necu da mlatim praznu slamu i objasnjavam ocigledno kao ti, pa da skratim.

Rastafarii ::Ispravna implementacija bi bila:

function utf8_ucfirst($string) {         return mb_strtoupper(mb_substr($string, 0, 1, 'UTF-8'), 'UTF-8'). mb_substr($string, 1, null, 'UTF-8'); }


Ovo ne valja. Smile

Drugarski savet: Ne siri se covece. Smile

Ko je trenutno na forumu
 

Ukupno su 1008 korisnika na forumu :: 56 registrovanih, 7 sakrivenih i 945 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., aramis s, bigfoot, bladesu, BlekMen, bobomicek, bojankrstc, bokisha253, Boris90, BRATORIII, bufanje, cemix, cinoeye, dane007, darcaud, Darko8, darkojbn, Dimitrije Paunovic, Dimitrise93, Djokislav, doklevise, Dorcolac, dule10savic, Excalibur13, Frunze, GORDI, goxin, hyla, ikan, karevski, kokodakalo, kubura91, kunktator, ljuba, mercedesamg, Mi lao shu, MiroslavD, naki011, Nemanja.M, nemkea71, nenooo, novator, nuke92, ozzy, raykan, S.Palestinac, shaja1, srbijaiznadsvega, trajkoni018, Tvrtko I, vladaa012, vladulns, vobo, voja64, VojvodaMisic, Webb