Autor Zpráva
Legáček
Profil
Zdravím programátoři,
už pár hodin se tu trápím s regulárníma výrazy. Mám questbook a když člověk přidá příspěvek tak ho nejdříve upravím a pak uložím do mysql. (Myslim, že lepší metoda než uložit a pak teprve při čtení z mysql upravit).
Hlavní věc, která mi nefunguje je že převádím odkazy do <a href=""> </a>, ale přitom bych chtěl zalomit text pokud někdo napíše delší slovo než 28.
$MaxDelka = 20;
$MaxDelkaSlova = 28;
$vstup = $_POST['txt'];
$text = preg_replace("~ +~", " ", $vstup);//odstraní přebytečné mezery
$text = preg_replace('~http://([a-zA-Z0-9\?=%&/\$\._äëöü#;-]*)~', ' http://\\1 ', $text);//přidá před a za odkaz mezery
$text = preg_replace('~" http://([a-zA-Z0-9\?=%&/\$\._äëöü#;-]*) "~', '"http://\\1"', $text);//odsraní mezery v atributech html-třeba u href="http://..."
$regular_href = '~^(http://[a-zA-Z0-9\?=%&/\$\._äëöü#;-]*)$~';//regulár pro překlad. Překládá
$slova = explode(" ",$text);
$text = "";
for($i = 0; $i < sizeof($slova); $i++) {
$cast = substr($slova[$i], 0, $MaxDelka);
if(preg_replace($regular_href, '<a href="\\1">'.$cast.'</a>', $slova[$i])) {
if(strlen($slova[$i])>$MaxDelka){$cast .= "...";} //pokud je odkaz delší než $MaxDelka bude zkrácen na $MaxDelka a přidají s eza něj ...(tečky))             
$slova[$i] = preg_replace($regular_href, '<a href="\\1">'.$cast.'</a>', $slova[$i]);//samotný převod
} 
else {
$slova[$i] = wordwrap($slova[$i], $MaxDelkaSlova, "<br />\n ", 1);//zalomí extrémě dlouhá slova delší než $MaxDelkaSlova 
}
$text .= " ".$slova[$i];
}
$vychozi = array("&"," <a href=\"","</a> ");
$nahrad = array("&amp;","<a href=\"","</a>");
$text = str_replace($vychozi,$nahrad,$text); //přeloží odkazy do správné podoby s ASCII a převede zpátky mezery před a za odkazem

Ano je to trochu úprava již zde vytvořené diskuze na toto téma, ale za boha mi nejde "ufiknout" slovo delší než 28. Zkoušel jsem to různě měnit, ale bez úspěchu.
Alphard
Profil
Kdyby vám stačila funkce, podívejte se na Dělení dlouhých slov. Rozdělí dlouhá slova, ignoruje html tagy, tj. nerozbije odkazy.

$text = preg_replace("~ +~", " ", $vstup);
Možná bych spíš použil \s - bílé znaky
Legáček
Profil
Alphard:
Na tento článek jsem už koukal a je to přesně to co nepotřebuji. Čte z mysql a poté teprve upraví a zobrazují. Já potřebuji aby to rovnou upravilo a pak uložilo do mysql. Pak se to bude jednoduše číst a bude to rychlejší + úprava toho textu bude taky jednoduší myslím, ale existují 2 názory na tohle no.

-Děkuji bílé mezery ošetřím trimem :)
Alphard
Profil
Legáček:
Já odkazoval konkrétně funkci wrapText(), která dělí dlouhá slova. Je lhostejné, kdy ji zavoláte…
Nebo něco nechápu?
Legáček
Profil
Alphard:
Jak jsem si tak pročítal tu funkci tak hlavní podstatou je, že vyhledává < > & a jiný znaky, která mám takový dojem přivést k tomu, že kontrolované slovo je
odkaz <a href="">...</a> co když ale v textu mám: "http://www.seznam.cz/ a dlouhýýýýýýýýýýý slovoooooo".
Samozřejmě to žádné takové znaky nenajde... Bouchněte mě do hlavy jestli tu kecám blbosti, díky :))
Alphard
Profil
Legáček:
že vyhledává < > & a jiný znaky
Neovlivní tagy, takže nerozbije odkazy. Nejdřív je potřeba použít regulár, aby odkazy upravil do html podoby <a href=""></a>, potom zavolat tuto funkci.

když ale v textu mám: "http://www.seznam.cz/ a dlouhýýýýýýýýýýý slovoooooo".
Tak to do dlouhéééého slova vloží mezery po zadaném počtu znaků.

Nevím, jestli nechápu já vás, nebo vy mě, tak zkusím příklad:
Na vstup
$in = 'Hooooooooooooooooooooodne dlouheeeeeeeeeeeeeeeeeeeee slovo a odkaz na zpravy <a href="http://zpravy.idnes.cz/mubarak-chce-vest-zemi-do-zarijovych-voleb-kahira-ozila-novymi-protesty-1ot-/zahranicni.asp?c=A110201_211843_zahranicni_brm">http://zpravy.idnes.cz/mubarak-chce-vest-zemi-do-zarijovych-voleb-kahira-ozila-novymi-protesty-1ot-/zahranicni.asp?c=A110201_211843_zahranicni_brm</a>';
echo wrapText(10, $in);

je výstup:
Hooooooooo oooooooooo oodne  dlouheeeee eeeeeeeeee eeeeee  slovo a odkaz na zpravy <a href="http://zpravy.idnes.cz/mubarak-chce-vest-zemi-do-zarijovych-voleb-kahira-ozila-novymi-protesty-1ot-/zahranicni.asp?c=A110201_211843_zahranicni_brm">http://zpr avy.idnes. cz/mubarak -chce-vest -zemi-do-z arijovych- voleb-kahi ra-ozila-n ovymi-prot esty-1ot-/ zahranicni .asp?c=A11 0201_21184 3_zahranic ni_brm</a>

Dlouhá slova jsou rozdělená, odkaz nepoškozen.
Legáček
Profil
Jsem teď ve škole, takže to nemůžu vyzkoušet, ale chcete mi říct, že když smažu řádky 26-28 mého scriptu a přidám tam upravenou funkci wrapText tak by mi to mělo rovnou brat upravenou adresu z řádku 23? Mám takovýho tušáka že to nepůjde.
Legáček
Profil
Alphard:
Tleskám, děkuji moc ;) Trochu jsem si s tím pohrál a vše funguje jak má :))

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0