| 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: 15 let
|
|||
0