Avatar billede Slettet bruger
26. juli 2009 - 20:31 Der er 19 kommentarer og
1 løsning

Omskrive funktion fra javascript til php (skal udskrive links i kommentarer)

Godaften eksperter,

Jeg er ikke helt sikker på hvordan jeg skal forklare problemet, men jeg prøver så godt jeg kan.

I mit kommentarsystem har jeg fået implementeret et javascript, hvor man har mulighed for at se et preview af sine kommentarer inden man poster. Her er der gjort således at html-tags ikke udskrives (ligesom når man bruger nl2br(htmlspecialchars(xx)))

I stedet sker der det at hvis der bliver skrevet [ b ]fed[ /b ], [ i ]skrå[ /i ], [ u ]understreget[ /u ], så bliver disse tags omskrevet så man i sit preview ser fed, skrå og understreget tekst. Kan se at det er præcis det samme som der også bliver brugt er på eksperten. Det samme sker hvis man bruger [ url ][ /url ] tag - her bliver der nemlig udskrevet et link! Dette fungerer helt som det skal.

Der er dog ikke mellemrum i klammerne! Det er for at det ikke skal se helt skidt ud her på eksperten, som min første tråd desværre kom til at gøre :(


Problemet:
Problemet opstår når kommentaren er blevet gemt i databasen og udskrives.

Jeg har fået gjort sådan at [ b ], [ i ] og [ u ] laves om og udskrives ligesom i preview, så dette fungerer efter hensigten. Det gør jeg på følgende måde:

$text = nl2br(htmlspecialchars($minteksther));
$text = str_replace("[ b ]","<b>", $text);
$text = str_replace("[ /b ]","</b>", $text);       
$text = str_replace("[ i ]","<i>", $text);
$text = str_replace("[ /i ]","</i>", $text);   
$text = str_replace("[ u ]","<u>", $text);
$text = str_replace("[ /u ]","</u>", $text);   

echo $text;

Men hvordan får jeg udskrevet mine links på samme måde som de blev udskrevet i min preview?

Jeg tænker at man nok på en eller anden måde skal ha omskrevet det jeg bruger fra javascriptet til php, så det kan blive brugt der? Men her står jeg så af :/

Mit javascript til preview funktionen ser således ud:


function previewComment()
{
    var str = '';
       
    var textarea = document.getElementById('text');
    var previewDiv = document.getElementById('preview');
    if(!textarea) return false;
    if(!previewDiv) return false;
       
    str = textarea.value;
       
    newlineRegex = /\n/ig;
    boldRegex = /\[b\](.*?)\[\/b\]/ig;
    italicRegex = /\[i\](.*?)\[\/i\]/ig;
    underlineRegex = /\[u\](.*?)\[\/u\]/ig;
    linkRegex = /\[url\]http:\/\/(.*?)\[\/url\]/ig;
    linkRegex2 = /\[url\](.*?)\[\/url\]/ig;
    tagStartRegEx = /</ig;
    tagEndRegEx = />/ig;
    newlineReplace = '<br />';
    boldReplace = '<b>$1</b>';
    italicReplace = '<i>$1</i>';
    underlineReplace = '<u>$1</u>';
    linkReplace = '<a href="http://$1" target="_blank" class="alternative">$1</a>';
    tagStartReplace = '<';
    tagEndReplace = '>';
   
      str = str.replace(tagStartRegEx,tagStartReplace);
        str = str.replace(tagEndRegEx,tagEndReplace);
    str = str.replace(newlineRegex,newlineReplace);
    str = str.replace(boldRegex,boldReplace);
    str = str.replace(italicRegex,italicReplace);
    str = str.replace(underlineRegex,underlineReplace);
    str = str.replace(linkRegex,linkReplace);
    str = str.replace(linkRegex2,linkReplace);

    str = '<div class="preview"><ul><li><div class="message"><div class="messagetitle"><div class="kommentaroverskrift">Preview</div></div><br /><div class="messagecontent">'+str+'</div><br /></div></li></ul></div>';
       
    previewDiv.innerHTML = str;
    return false;
}
Avatar billede Slettet bruger
26. juli 2009 - 20:35 #1
Hvis det ikke kan lade sig gøre på ovenstående måde er mit alternativ at jeg ikke benytter mig af [url] [/url] og i stedet automatisk udskriver links ligesom eksperten gør. Dette kan også godt lade sig gøre ved at bruge min funktion her:

function text_url($str) {
  $ins_str = "";
  $str = preg_replace ("/(ftp|http|https|telnet|news|nntp|file|irc):\/\/([a-å0-9~#%@&:;=!',_æøå\(\)\?\/\.\-\+\[\]\|\*\$\^\{\}]+)/i", "<a href=\"\\1://\\2\" target=\"_blank\" class=\"alternative\"".$ins_str.">\\1://\\2</a>", $str);
  $str = preg_replace ("/(\s|tp\:|\(|\[|\>)(www\.)([a-å0-9~#%@&:;=!',_æøå\(\)\?\/\.\-\+\[\]\|\*\$\^\{\}]+)/i", "\\1<a href=\"http://\\2\\3\" target=\"_blank\" class=\"alternative\"".$ins_str.">\\2\\3</a>", $str);
  $str= preg_replace("/(^| |>)(www\.)([a-å0-9~#%@&:;=!'\(\)\?\/\.\-\+\[\]\|\*\$\^\{\}]+)/i", "\\1<a href=\"http://\\2\\3\" target=\"_blank\" class=\"alternative\"".$ins_str.">\\2\\3</a>", $str);
  return $str;
}

Men hvordan får jeg så lavet om i mit javascript, så det viser præcis det samme i preview som der bliver udskrevet når kommentaren er posted?

(Jeg er ligeglad med hvilken af løsningerne i vælger - vil bare sætte utrolig stor pris på hvis det kunne lade sig gøre at løse det på en af måderne :( )
Avatar billede repox Seniormester
26. juli 2009 - 21:29 #2
Det er nu meget godt at du har brugt så megen tid på at dokumentere dit problem, men jeg tror du skal komme frem med noget vi kan se og føle, før vi kan følge dig.

Det er ikke fordi det er synderligt svært at lave en preview funktion, men umiddelbart lyder det for mig som om du har gjort det unødigt kompliceret for dig selv.

Min tanke er at at en preview funktion bør fungere på nøjagtig samme måde med parsing af teksten som hvis det var en reel post.
Den eneste forskel ville være visningen og om teksten bliver gemt eller ej.
Avatar billede Slettet bruger
26. juli 2009 - 23:40 #3
Er ikke helt på hvad jeg ellers lige skal smide op :/ ?

Jeg prøvede også først at lave preview funktionen i php, men efter adskillige timer opgav jeg helt at bøvle videre med det.. Derfor fandt jeg i stedet det javascript som virkede efter nogle få rettelser :) Ved så bare ikke hvordan jeg får det gjort identisk med php scriptet :/
Avatar billede repox Seniormester
26. juli 2009 - 23:46 #4
Hvordan får du din post funktion til at virke, når du ikke kan få en preview funktion til at virke i PHP?
Avatar billede Slettet bruger
26. juli 2009 - 23:53 #5
Altså, jeg kunne godt få preview funktionen til at virke i PHP ;)

Det største problem opstod dog i mine sessions, da jeg valgte at gemme indholdet fra mit textarea i en session og udskrive det i mit preview felt længere nede.. Hvis man så klikkede væk fra siden igen uden at poste kommentaren eller sådan så var den der jo blot igen når man kom tilbage og sådan..

Derfor syntes jeg bl.a. at javascript udvejen var klart den nemmeste :/
Avatar billede repox Seniormester
26. juli 2009 - 23:57 #6
Bortset fra at du nu har nye problemer pga den.

Din session idé var fin nok. Det var bare din opgave at sørge for at sessionen blev nulstillet når siden blev ændret. Det ville da have været en nemmere opgave at løse end at lave to identiske funktioner i hver sit lag...
Avatar billede Slettet bruger
27. juli 2009 - 00:03 #7
Men hvordan gør jeg således at sessionen nulstiller sig når siden ændres så? Hvis det er nemt nok vil jeg godt prøve at lave det om igen og prøve med php funktionen ;)
Avatar billede repox Seniormester
27. juli 2009 - 00:08 #8
Det afhænger jo af, hvordan du sætter den og hvordan du bruger den?
Avatar billede Slettet bruger
27. juli 2009 - 00:26 #9
Sådan her fx:

<?php
if(isset($_POST["preview"]) || isset($_POST["preview_x"])){
    $_SESSION['previewtext'] = $_POST['text'];
    $_SESSION['preview'] = nl2br(htmlspecialchars($_POST['text']));
    header("Location: http://localhost/udeboende/blogs/".$_GET['id']."#preview");
}
?>

Der er $_SESSION['previewtext'] så til at gemme i textarea'en (uden html tegn), mens $_SESSION['preview'] er til previewfeltet, der bliver lavet hvis sessionen er sat.. Hvordan gør jeg det så her? :)
Avatar billede repox Seniormester
27. juli 2009 - 00:34 #10
Jeg forstår slet ikke hvorfor det er nødvendigt?

Hvis du alligevel poster dataen til en side, hvorfor så ikke vise den side med POST dataen? Og så indsætte det i dit textarea istedet for at bruge sessions?

<div id="preview">
    <?php echo nl2br(htmlspecialchars($_POST["text"])); ?>
<div>

<textarea name="text"><?php echo $_POST["text"]; ?></textarea>

Dine data går således ikke tabt.
Avatar billede Slettet bruger
27. juli 2009 - 00:52 #11
Well, jeg poster ikke dataen til en ny side, men blot den samme side, som så indsætter det i db..

Men altså - det virker ikke hvis jeg prøver sådan der :(

<?php
if(isset($_POST["reply"]) || isset($_POST["reply_x"])){
---kommentaren skrives til databasen---
}

echo '<form method="post" action="">';
echo '<textarea name="text" id="text" rows="10" cols="62" class="input3">'.$_POST['text'].'</textarea><br/>';
echo '<input type="image" name="reply" class="input" src="images/buttonpost.png" />';
echo ' <input type="image" name="preview" class="input" src="images/buttonpreview.png" />';
echo '</form>';

?>

<div id="preview">
<?php echo nl2br(htmlspecialchars($_POST["text"])); ?>
</div>


Sådan ser de enkelte dele ud i hovedtræk - hvad gør jeg galt :( ?
Avatar billede repox Seniormester
27. juli 2009 - 00:56 #12
Det ved jeg ikke. Hvad er det der ikke virker?
Avatar billede Slettet bruger
27. juli 2009 - 00:56 #13
Ah jo.. nu kom jeg i tanke om hvorfor..

Det er pga. jeg i toppen "redirecter til siden" og så forsvinder dataen jo.. Men grunden til at jeg redirecter er for at få min "ancor" på (altså link.php#preview), så jeg kan komme ned i bunden af siden til mit preview.. Kan jeg gøre det på en anden måde så?
Avatar billede repox Seniormester
27. juli 2009 - 01:01 #14
Ja.
Der er ikke noget i vejen for at lade browseren styre det.

<form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>#preview">

Og hvis du poster et reply istedet for til preview, så skal du jo alligevel bruge header("Location: ..."), så det betyder ikke noget.
Avatar billede Slettet bruger
27. juli 2009 - 01:02 #15
Altså jeg havde en header på i toppen, som smed en ancor (#preview) efter linket for at komme ned i bunden af siden til preview feltet :/ Hvis man kan gøre det på en anden måde vil det bare være fantastisk!
Avatar billede repox Seniormester
27. juli 2009 - 01:06 #16
Hvad med at prøve det, så?
Avatar billede Slettet bruger
27. juli 2009 - 01:08 #17
Den metode kan jeg så desværre ikke helt bruge pga. jeg benytter mig af htaccess.. Så bliver den smidt til den rigtige adresse, hvilket ødelægger det..

Jeg har i stedet prøvet:

<?php
echo '<form method="post" action="http://adressenher.dk/'.$_GET['id'].'#preview">';
?>

Der opstår så bare et nyt problem, da den løsning kun kan bruges hvis kommentaren er til hele topic.. Hvis kommentaren er et svar til en anden person er det nemlig en anden adresse der skal ind.. Men jeg prøver at se om jeg kan løse det med lidt if sætninger - ellers vender jeg lige tilbage :)
Avatar billede repox Seniormester
27. juli 2009 - 01:11 #18
Alternativt skal du bibeholde dine sessions, men så kun gøre dem relevante i de aktuelle tråde; ligesom de gør her på eksperten.

f.eks
<?php

    $_SESSION["spm"][881900]["previewTekst"] = "Min preview tekst";
?>

Så ved du at du kun under spørgsmål nummer 991900 skal have en preview tekst. Så behøver du ikke tænke på om den samme preview tekst ses i andre tråde.
Avatar billede Slettet bruger
27. juli 2009 - 01:15 #19
Yearh okay, men det lykkedes mig at få det til at virke med det ancor halløj med et par forespørgsler ;)

<?php
if ($_GET['replyTo'] || $_GET['puserid'] || $_GET['no']){
echo '<form method="post" action="http://minadresse/'.$_GET['id'].'/'.$_GET['replyTo'].'/'.$_GET['puserid'].'/'.$_GET['no'].'#preview">';
}
       
else{
echo '<form method="post" action="http://minadresse/'.$_GET['id'].'#preview">';
}
?>

Fantastisk ;) Smid et svar og du skal få nogle velfortjente points - tussind tak!
Avatar billede repox Seniormester
27. juli 2009 - 01:24 #20
Jamen, jeg er da glad for at du fik det til at virke.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester