Autor | Zpráva | ||
---|---|---|---|
sacrebleu Profil * |
#1 · Zasláno: 4. 2. 2011, 00:15:13
Ahoj, mám proměnou:
$post['komentar_text'] Uživatel do ní zadá například text podobný tomuto: „Čínský útok na satelit s použitím zbraně vynesené balistickým nosičem může zničit mírový systém, který Spojené státy a další národy využívají pro obchod a upevnění národní bezpečnosti. Ničení satelitů ohrožuje lidi,“ uvádí se v prohlášení připraveném pro tehdejší ministryni zahraničí Condoleezzu Riceovou, které adresovala Pekingu v lednu 2008. A varování pokračovalo: „Jakýkoli zásah vůči vesmírným systémům USA budou Spojené státy považovat za narušení svých práv a krok k eskalaci krize nebo konfliktu. Spojené státy si vyhrazují právo, v souladu s chartou OSN a mezinárodním právem, bránit a chránit svá zařízení v kosmu s využitím široké škály prostředků od diplomatických po vojenské.“ Čínský test kritizovaly i další státy s tím, že to oživuje program „Hvězdných válek“, které před sklonkem studené války vyhlásil americký prezident Ronald Reagan v 80. letech. A já bych chtěl převést ten text do html odstavců a pak si ho třeba uložit do databáze, to je jedno. Zkoušel jsem to pomocí: $post['komentar_text'] = mysql_real_escape_string(htmlspecialchars(trim($post['komentar_text'])); $post['komentar_text'] = '<p>'.$post['komentar_text'].'</p>'; $post['komentar_text'] = str_replace("\n\n", '</p><p>', $post['komentar_text']); Ale tohle nefunguje, pouze se celý text dá do odstavce... zkoušel jsem také variantu: $post['komentar_text'] = mysql_real_escape_string(htmlspecialchars(trim($post['komentar_text'])); $post['komentar_text'] = str_replace("\r\n", "\n", $post['komentar_text']); $post['komentar_text'] = '<p>'.$post['komentar_text'].'</p>'; $post['komentar_text'] = str_replace("\n\n", '</p><p>', $post['komentar_text']); Také to však nefunguje... poradíte mi prosím, co dělám špatně? Předem děkuji za reakce! |
||
Neas Profil |
#2 · Zasláno: 4. 2. 2011, 00:36:21
řádek:
$post['komentar_text'] = mysql_real_escape_string(htmlspecialchars(trim($post['komentar_text'])); přijde až na konec |
||
sacrebleu Profil * |
#3 · Zasláno: 4. 2. 2011, 00:49:14
Nějaká z těch funkcí odstraňuje konce uvnitř textu? :o)
|
||
Neas Profil |
#4 · Zasláno: 4. 2. 2011, 11:01:28
myslím, že za to může mysql_real_escape_string(), která oescapuje \r\n
v každém případě ti doporučuju script takto ještě upravit: $t = trim($post['komentar_text'])."\r\n"; $t = preg_replace("((.+?)\\\r\\n)", "<p>$1</p>", $t); $t = str_replace("\r\n", '<br>', $t); $t = mysql_escape_string(htmlspecialchars($t)); takto se vyhneš prázdnému odstavci, pokud nějaký uživatel použije dvojité odřádkování. První řádek přidá na konec textu odřádkování. Druhý vezme všechny úseky textu, které končí odřádkováním a tyto úseky textu obalí elementem <p> Třetí řádek nahradí všechny zbylé odřádkování (které by ve tvém řešení způsobily prázdný odstavec) a nahradí je elementem <br> |
||
sacrebleu Profil * |
#5 · Zasláno: 4. 2. 2011, 14:21:59
Opravdu za to může
mysql_real_escape_string() Díky, zkusím. Každopádně jsem narazil na jiné úskalí - potřebuji v textu nahradit odkazy a rozdělit dlouhá slova i odkazy, aby když někdo zadá dloooooooooooooooooooooouhéééééééééé slovo aby se rozdělilo... u odkazu také, ale musí zůstat celý v href="" $slova = explode(' ', $post['komentar_text']); $post['komentar_text'] = null; // Projití všech slov a vyhledání odkazů foreach ($slova as $slovo) { //echo $slovo."<br />"; if (preg_match('#^(http|ftp|https)?://[a-z0-9-_.]+\.[a-z]{2,4}#i',$slovo)) { $slovo = '<a href="'.$slovo.'">'.wordwrap($slovo, 20, '-', 1).'</a>'; } else { $slovo = wordwrap($slovo, 20, '-', 1); }; $post['komentar_text'] .= $slovo.' '; }; // exit; $post['komentar_text'] = str_replace("\r\n", "\n", $post['komentar_text']); $post['komentar_text'] = '<p>'.$post['komentar_text'].'</p>'; $post['komentar_text'] = str_replace("\n\n", '</p><p>', $post['komentar_text']); foreach ($post as $co => $hodnota) { $post[$co] = mysql_real_escape_string($hodnota); // Ochrana proti SQL injection }; Tohle funguje - ale je problém když uživatel zadá (slovo odkaz si nahraďte libovolným http:// odkazem): Ahoj odkaz Stane se to, že explode nerozdělí text na slova - není tam žádná mezera že... jenom \n\n Pokud zadá Ahoj odkaz před ten odkaz dá mezeru, tak je vše v pořádku. Jak to doladit aby to fungovalo? Když v první části nahradím \n\n za odstavce tak mi je potom funkce wordwrap rozbije... |
||
panther Profil |
#6 · Zasláno: 4. 2. 2011, 14:25:36 · Upravil/a: panther
|
||
sacrebleu Profil * |
#7 · Zasláno: 4. 2. 2011, 15:57:13
Tak jsem po dlouhém zkoušení všeho možného napsal tohle:
<?php $post = $_POST; $post['komentar_text'] = str_replace("\r\n", "\n", $post['komentar_text']); $radky = explode("\n", $post['komentar_text']);// var_dump($odstavce); exit; $post['komentar_text'] = null; foreach ($radky as $radek) { // Projití všech slov na řádku a vyhledání odkazů if($radek != "") { $slova = explode(' ', trim($radek)); foreach ($slova as $slovo) { //echo $slovo."<br />"; if (preg_match('#^(http|ftp|https)?://[a-z0-9-_.]+\.[a-z]{2,4}#i',$slovo)) { $slovo = '<a href="'.$slovo.'">'.wordwrap($slovo, 20, '-', 1).'</a>'; } else { $slovo = wordwrap($slovo, 20, '-', 1); }; $post['komentar_text'] .= $slovo.' '; }; $post['komentar_text'] = trim($post['komentar_text'])."\n"; } else { $post['komentar_text'] .= "\n"; }; }; $post['komentar_text'] = '<p>'.trim($post['komentar_text']).'</p>'; $post['komentar_text'] = str_replace("\n\n", '</p><p>', $post['komentar_text']); echo $post['komentar_text']; ?> Funguje to tak jak má, ale není to zbytečně složité? Jde mi o to aby se odstavce dělaly pomocí dvojitého odřádkování. |
||
Časová prodleva: 6 dní
|
|||
sacrebleu Profil * |
#8 · Zasláno: 10. 2. 2011, 15:19:16
Tak sem to doladil snad k dokonalosti... alespoň pro mě to konečně funguje tak jak sem si představoval, třeba můj kód pomůže ještě někomu jinému:
<?php $post = $_POST; $post['komentar_text'] = htmlspecialchars($post['komentar_text']); $post['komentar_text'] = str_replace("\r\n", "\n", $post['komentar_text']); $radky = explode("\n", $post['komentar_text']); $post['komentar_text'] = null; foreach ($radky as $radek) { // Projití všech slov na řádku a vyhledání odkazů if ($radek != "") { $slova = explode(' ', trim($radek)); foreach ($slova as $slovo) { if (preg_match('#^(http|ftp|https)?://[a-z0-9-_.]+\.[a-z]{2,4}#i',$slovo)) { $slovo = '<a href="'.$slovo.'">'.wordwrap($slovo, 25, '-', 1).'</a>'; } else { $slovo = wordwrap($slovo, 20, '-', 1); }; $post['komentar_text'] .= $slovo.' '; }; $post['komentar_text'] = trim($post['komentar_text'])."\n"; } else { $post['komentar_text'] .= "\n"; }; }; $post['komentar_text'] = preg_replace("((.+?)\\\n\\n)", "$1</p><p>", $post['komentar_text']); $post['komentar_text'] = str_replace("\n", '', $post['komentar_text']); $post['komentar_text'] = '<p>'.$post['komentar_text'].'</p>'."\n"; echo $post['komentar_text']; ?> |
||
Časová prodleva: 13 let
|
0