Avatar billede gider_ikke_mere Nybegynder
13. oktober 2005 - 21:12 Der er 12 kommentarer og
1 løsning

addslashes giver problemer

Jeg indsætter i øjeblikket tekster fra et forum og et mailsystem (internt mailsystem) med funktionen addslashes().

Dette er fordi jeg lige før skrivning til DB konverterer mailadresser og webadresser til links.

Det har nu, for mailsystemet, givet problemer da disse mail bliver vist i et textarea. Det vil sige at jeg skal konvertere eksempelvis " til " o.s.v.

Findes der en funktion til dette, så jeg ikke skal bruge eksempelvis str_replace() 10-20 gange for at erstatte disse tegn... eller har du en helt anden mening om hvordan jeg skal gribe det an? Bør konverteringen først foregå ved hentning af data fra DB?
Avatar billede gider_ikke_mere Nybegynder
13. oktober 2005 - 21:20 #1
Ok fandt det selv! htmlspecialchars()
Men hvordan ville du gribe det an?
Avatar billede erikjacobsen Ekspert
13. oktober 2005 - 21:21 #2
Hvis PHP ikke selv laver addslashes, skal du gøre det, men du skal ikke gøre det to gange.
I et textarea skal du vise teksten med en htmlentities.
Avatar billede erikjacobsen Ekspert
13. oktober 2005 - 21:21 #3
htmlentities er ca. det samme som htmlspecialchars ;)
Avatar billede gider_ikke_mere Nybegynder
13. oktober 2005 - 23:26 #4
Jeg er ved at gå fuldstændig kold i det her.
Jeg bruger i forum følgende kode til at lave links på adresser. Nu kan jeg ikke bruge den til mail, da jeg selvfølgelig ikke kan vise links i et textarea. Problemet er at jeg ikke i denne kode kan se hvad der udskifter linieskift med <br>!!!

<?php
function formaterTekst($tekst, $target = "_blank", $tags = "<b><i>") {
    $tekst = trim($tekst);
    $tekst = ucfirst($tekst);
    $tekst = strip_tags($tekst, $tags."<b><i>");
    $tekst = str_replace("&", "&amp;", $tekst);
    $tekst = str_replace("mailto:", "", $tekst);
    $tekst = formaterTekst_url($tekst, $target);
    $tekst = formaterTekst_email($tekst);
    $tekst = formaterTekst_orden_slutbogstav($tekst);
    $tekst = str_replace("  ", "&nbsp; ", $tekst);
    $tekst = str_replace("\t", "&nbsp;&nbsp;&nbsp; ", $tekst);
    $tekst = str_replace("\r", "", $tekst);
    $tekst = str_replace("\n", "<br>", $tekst);
    return $tekst;
}

function formaterTekst_url($tekst, $target) {
    $indsaet_attribut = "";
    if ($target) $indsaet_attribut = " target=\"".$target."\"";
    $tekst = formaterTekst_udvid($tekst);
    $tekst = preg_replace ("/(ftp|http|https|telnet|news|nntp|file|irc):\/\/([a-z0-9~#%@&:;=!',_æøå\(\)\?\/\.\-\+\[\]\|\*\$\^\{\}]+)/i", "<a href=\"\\1://\\2\"".$indsaet_attribut."><span class=\"hyperlink\">\\1://\\2</span></a>", $tekst);
    $tekst = preg_replace ("/(\s|tp\:|\(|\[|\&gt;)(www\.)([a-z0-9~#%@&:;=!',_æøå\(\)\?\/\.\-\+\[\]\|\*\$\^\{\}]+)/i", "\\1<a href=\"http://\\2\\3\"".$indsaet_attribut."><span class=\"hyperlink\">\\2\\3</span></a>", $tekst);
    $tekst = preg_replace ("/(\s|tp\:|\(|\[|\&gt;)(ftp\.)([a-z0-9~#%@&:;=!',_æøå\(\)\?\/\.\-\+\[\]\|\*\$\^\{\}]+)/i", "\\1<a href=\"ftp://\\2\\3\"".$indsaet_attribut."><span class=\"hyperlink\">\\2\\3</span></a>", $tekst);
    return formaterTekst_reducer($tekst);
}

function formaterTekst_email($tekst) {
    $tekst = formaterTekst_udvid($tekst);
    $tekst = preg_replace ("/([\s|\"])([\w|\.|\-|_]+)@([\w||\-|_]+)\.([\w|\.|\-|_]+)/i", "\\1<a href=\"mailto:\\2@\\3.\\4\"><span class=\"hyperlink\">\\2@\\3.\\4</span></a>", $tekst);
    return formaterTekst_reducer($tekst);
}


function formaterTekst_orden_slutbogstav($tekst) {
    $tekst = preg_replace ("/([\'\"\)\]\.\,\?\!]+)\">/i", "\">", $tekst);
    $tekst = preg_replace ("/([\'\"\)\]\.\,\?\!]+)\" (target|class)=\"/i", "\" \\2=\"", $tekst);
    $tekst = preg_replace ("/([\'\"\)\]\.\,\?\!]+)<\/a>/i", "</a>\\1", $tekst);
    return $tekst;
}

function formaterTekst_udvid($tekst) {
    return " ".$tekst." ";
}

function formaterTekst_reducer($tekst) {
    return substr($tekst, 1, -1);
}
?>
Avatar billede erikjacobsen Ekspert
13. oktober 2005 - 23:30 #5
Det er nok den her linie der udskifter linieskift med <br>

      $tekst = str_replace("\n", "<br>", $tekst);

men i et tekstarea skal du slet ikke lave alle de ændringer du viser her. Jeg kan ikke helt se hvor du vil hen ...
Avatar billede gider_ikke_mere Nybegynder
13. oktober 2005 - 23:33 #6
Bruger jeg $mail = str_replace( "\n", "<br>", $mail); bliver

"hallo

igen"

... udskiftet med

"hallo
<br>igen"

... i stedet for

"hallo<br>igen"

Altså linieskiftet bliver ikke fjernet selvom den godt kan finde ud af at der skal skrives <br>!
Avatar billede gider_ikke_mere Nybegynder
13. oktober 2005 - 23:40 #7
I indbakken linier jeg overskriften på mailen op således:

TekstMail = '<?php echo $mail[$row["Id"]]; ?>';

Ved klik på denne tekst bliver teksten i mit textarea sat med:

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_setTextOfTextfield(objName,x,newText) { //v3.0
  var obj = MM_findObj(objName); if (obj) obj.value = newText;
}

MM_setTextOfTextfield('Mail','', TekstMail)

... men hvis TekstMail indeholder så meget som et eneste linieskift går det galt
Avatar billede erikjacobsen Ekspert
13. oktober 2005 - 23:40 #8
Så er det nok et Windows linieskift: \r\n  - de skal da også lave alting på deres egen måde...
Avatar billede erikjacobsen Ekspert
13. oktober 2005 - 23:41 #9
Jeg står af når jeg ser "MM_" i et script. Beklager.
Avatar billede gider_ikke_mere Nybegynder
13. oktober 2005 - 23:50 #10
Her er et forkert resultat sf overskriften som ikke vil godkendes (kildekode fra resultat):

<h4 id="28" style="font-weight: bold;" onclick="besvar = 'Re:&nbsp;test\n'; TilAuthor = 'Alex'; TekstMail = 'Se her:
\n
\nhttp://www.dr.dk \n
\n
\n&lt;br&gt;'; skrivlaesttildb(this); MM_setTextOfTextfield('Mail','', TekstMail); ">&nbsp;test&nbsp;</h4>

... og sådan skal den se ud!

<h4 id="28" style="font-weight: bold;" onclick="besvar = 'Re:&nbsp;test\n'; TilAuthor = 'Alex'; TekstMail = 'Se her:\n\nhttp://www.dr.dk \n\n\n&lt;br&gt;'; skrivlaesttildb(this); MM_setTextOfTextfield('Mail','', TekstMail); ">&nbsp;test&nbsp;</h4>

... altså ingen linieskift.

Når siden med først viste resultat loades, meldes der allerede fejl: "strengkonstanten er uafsluttet". Det skyldes de linieskift der er i følgende:

'Se her:
\n
\nhttp://www.dr.dk \n
\n
\n&lt;br&gt;'
Avatar billede gider_ikke_mere Nybegynder
14. oktober 2005 - 00:09 #11
Nogen gange går der ufatteligt lang tid inden indlæggene bliver vist her på www.eksperten.dk.
Ja! Det var et Windows linieskift der var årsagen. "\r\n" erstattes med "<br>" og så kører det :-)

Giver du et svar!

Hvad er dine "ekspert"-områder?
Avatar billede erikjacobsen Ekspert
14. oktober 2005 - 09:45 #12
Jeg samler slet ikke på point, tak. Og jeg går langt uden om javascript med "MM_" i sig ;)
Avatar billede gider_ikke_mere Nybegynder
19. oktober 2005 - 02:29 #13
Ok
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