Autor Zpráva
sacrebleu
Profil *
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.
(úryvek textu z novinky.cz)

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
řádek:
$post['komentar_text'] = mysql_real_escape_string(htmlspecialchars(trim($post['komentar_text']));

přijde až na konec
sacrebleu
Profil *
Nějaká z těch funkcí odstraňuje konce uvnitř textu? :o)
Neas
Profil
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 *
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
sacrebleu:
potřebuji v textu nahradit odkazy a rozdělit dlouhá slova
word-wrap v CSS, příp. v PHP wordwrap
sacrebleu
Profil *
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í.
sacrebleu
Profil *
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'];
?>

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