Avatar billede phpbegynder2004 Nybegynder
07. marts 2007 - 17:36 Der er 7 kommentarer og
1 løsning

Problemer med validering og behandling af post data

Hej,

På min hjemmeside har jeg et forum. Der er nogle tekst-formatterings funktioner, så som at:
- :) bliver til en smiley (img-tag)
- links bliver klikbare
- tekst kan gøres fed, kursiv og understreget med henholdsvis [f], [k], [u].
- lange ord skal brydes op, så de ikke ødelægger designet (tables)


Jeg har dog nogle problemer:

- Når man skriver et meget langt link, skal dette IKKE brydes op, da det jo ødelægger linket. Det har givet det problem, at lange links ødelægger designet. er det muligt at man kan nøjes med bare at udskrive noget af linket, men selve referencen er stadig fuld?
Eks. www.dr.dk/index?action=d ... /index.htm (henviser til www.dr.dk/index?action=drama&link2=this&link3=/index.htm)

- Når man skriver ") bliver det opfattet som ;) (det er fordi " bliver konverteret til quot;

Hvis i har flere rettelser eller gode forslag er de meget velkomne!

På forhånd mange tak for hjælpen!


----func.php-----

<?php
include("tagster_lib.php");

/************************ Wordwrap der ikke ødelægger hyperlinks START ****************************************/
function nywordwrap($str, $max = 100, $break = ' ') {
 
  // create array by deviding at each occurrence of "<a"
  $arr = explode('<a', $str);

  // break up long words in $arr[0] since
  // it will never contain a hyberlink
  $arr[0] = preg_replace('/([^\s]{'.$max.'})/i',"$1$break",$arr[0]);

  // run loop to devide remaining elements
  for($i = 1; $i < count($arr); $i++) {

  // devide each element in $arr at each occurrence of "</a>"
  $arr2 = explode('</a>', $arr[$i]);

  // break up long words in $arr2 that does not
  // contain hyberlinks
  $arr2[1] = preg_replace('/([^\s]{'.$max.'})/i',"$1$break",$arr2[1]);

  // rejoin $arr2 and assign as element in $arr
  $arr[$i] = join('</a>', $arr2);
  }
  // rejoin $arr to string and return it
  return join('<a', $arr);
}

/************************ Wordwrap der ikke ødelægger hyperlinks SLUT ****************************************/



/************************ Smiley START ****************************************/
  $smiley_tag = array(
    '@-)',
    ':||',
    ':-||',
    '8-0',
    '|-I',':-0',
    ':-p',
    ':p',
    ':P',
    '8-)',
    '8)',
    ':-D',
    ':D',
    ';)',
    ';-)',
    ':(',
    ':)',
    ':-)',
    '[stjerne]',
    '[skidt]',
    '[godt]',
    '[love]',
    '[broken-love]'
  );

  $smiley_img = array(
    '<img src="pic/smileys/rolleyes.gif">',
    '<img src="pic/smileys/angry.gif">',
    '<img src="pic/smileys/angry.gif">',
    '<img src="pic/smileys/eek.gif">',
    '<img src="pic/smileys/sleep.gif">',
    '<img src="pic/smileys/terrefied.gif">',
    '<img src="pic/smileys/tongue.gif">',
    '<img src="pic/smileys/tongue.gif">',
    '<img src="pic/smileys/tongue.gif">',
    '<img src="pic/smileys/cool.gif">',
    '<img src="pic/smileys/cool.gif">',
    '<img src="pic/smileys/biggrin.gif">',
    '<img src="pic/smileys/biggrin.gif">',
    '<img src="pic/smileys/wink.gif">',
    '<img src="pic/smileys/wink.gif">',
    '<img src="pic/smileys/frown.gif">',
    '<img src="pic/smileys/smiley.gif">',
    '<img src="pic/smileys/smiley.gif">',
    '<img src="pic/smileys/star.gif">',
    '<img src="pic/smileys/thumbdown.gif">',
    '<img src="pic/smileys/thumbup.gif">',
    '<img src="pic/smileys/hjerte.gif">',
    '<img src="pic/smileys/hjerte-itu.gif">'
  );

/************************ Smiley slut ****************************************/



function skriv($Besked){
  $Besked = htmlentities($Besked, ENT_QUOTES);
  $Besked = str_replace("&Atilde;&brvbar;", "&aelig;", $Besked);
  $Besked = str_replace("&Atilde;&cedil;", "&oslash;", $Besked);
  $Besked = str_replace("&Atilde;&yen;", "&aring;", $Besked);
  $Besked = str_replace("&Atilde;˜;", "&AElig;", $Besked);
  $Besked = str_replace("&Atilde;˜;", "&Oslash;", $Besked);
  $Besked = str_replace("&Atilde;˜;", "&Aring;", $Besked);

  global $smiley_tag, $smiley_img;
  $Besked = str_replace($smiley_tag,$smiley_img,$Besked);

  //Source, fed, kursiv og understreget
  $Besked = preg_replace("/\[code\](.*?)\[\/code\]/ims","<pre width=\"100%\" style=\"display: inline; font-family: Courier;\">\\1</pre>", $Besked);
  $Besked = preg_replace( "/\[f\](.*?)\[\/f\]/ims", "<b>\\1</b>", $Besked);
  $Besked = preg_replace( "/\[k\](.*?)\[\/k\]/ims", "<i>\\1</i>", $Besked);
  $Besked = preg_replace( "/\[s\](.*?)\[\/s\]/ims", "<s>\\1</s>", $Besked);
  $Besked = preg_replace( "/\[u\](.*?)\[\/u\]/ims", "<u>\\1</u>", $Besked);
  $Besked = tagster_format($Besked);

  //Linjeskift
  //$Besked = str_replace("\t", "&nbsp;&nbsp;&nbsp; ", $Besked);
  $Besked = str_replace("\r", "", $Besked);
  $Besked = str_replace("\n", "<br> ", $Besked);
  $Besked = nywordwrap($Besked);

  RETURN $Besked;
}

?>


---- tagster_lib.php -----
<?php

function tagster_format($str, $target="_blank", $css_class="", $fixlongword = 0) {
$str = tagster_url($str, $target, $css_class);
$str = tagster_email($str, $css_class);
$str = tagster_fix_endchar($str);
return $str;
}


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


function tagster_email($str, $css_class="") {
$ins_class = "";
if ($css_class) $ins_class = " class=\"".$css_class."\"";
$str = tagster_expand($str);
$str = preg_replace ("/([\s\"])([\w\.\-_]+)@([\w\-_]+)\.([\w\.\-_]+)/i", "\\1<a href=\"mailto:\\2@\\3.\\4\"".$ins_class.">\\2@\\3.\\4</a>", $str);
return tagster_reduce($str);
}


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

function tagster_expand($str) {
return " ".$str." ";
}

function tagster_reduce($str) {
return substr($str, 1, -1);
}
?>
Avatar billede jakobdo Ekspert
07. marts 2007 - 22:02 #1
Jeg har selv brugt denne funktion:
function text_url($str, $target, $css_class)
{
    $ins_str = "";
    if ($css_class)
        $ins_str .= " class=\"".$css_class."\"";
    if ($target)
        $ins_str .= " target=\"".$target."\"";
   
    $str = preg_replace_callback ("/(ftp|http|https|telnet|news|nntp|file|irc):\/\/([a-z0-9~#&:;=!',_æøå\(\)\?\/\.\-\+\[\]\|\*\$\%\^\{\}]+)/i", create_function('$matches','if( strlen($matches[2]) > 25 ) $name = substr($matches[2],0,25) . ".."; else $name = $matches[2]; return "<a".$ins_str." href=\"{$matches[1]}://{$matches[2]}\">$name</a>";'),$str);
    $str = preg_replace_callback ("/(\s|tp\:|\(|\[|\&gt;)(www\.)([a-z0-9~#&:;=!',_æøå\(\)\?\/\.\-\+\[\]\|\*\$\%\^\{\}]+)/i",                    create_function('$matches','if( strlen($matches[3]) > 25 ) $name = substr($matches[3],0,25) . ".."; else $name = $matches[3]; return "<a".$ins_str." href=\"http://$matches[2]$matches[3]\">$name</a>";'), $str);
    $str = preg_replace_callback ("/(\s|tp\:|\(|\[|\&gt;)(ftp\.)([a-z0-9~#&:;=!',_æøå\(\)\?\/\.\-\+\[\]\|\*\$\%\^\{\}]+)/i",                    create_function('$matches','if( strlen($matches[3]) > 25 ) $name = substr($matches[3],0,25) . ".."; else $name = $matches[3]; return "<a".$ins_str." href=\"ftp://$matches[2]$matches[3]\">$name</a>";'), $str);

  return $str;
}

Den laver linket til max 25 tegn, men selve linket er fuldt.
Avatar billede phpbegynder2004 Nybegynder
10. marts 2007 - 01:29 #2
Mange tak for hjælpen! Det ser ud til at virke. Læg et svar!
Men jeg har stadig et andet problem med tegn formateringen.

Jeg har specificeret det her:
http://www.eksperten.dk/spm/767139
Avatar billede jakobdo Ekspert
10. marts 2007 - 09:26 #3
Du får lige et svar her! :o)
Avatar billede phpbegynder2004 Nybegynder
10. marts 2007 - 13:13 #4
Tak for det! Som du måske kan se, blev mit andet problem løst. Jeg er dog stødt på et nyt.
Jeg har en funktion hvor man kan redigere sine indlæg i forummet. Derfor skal alt html kode formateres den anden vej igen.

Nu har jeg et problem med linket, da jeg tidligere brugte følgende:
$str = preg_replace('@<[\/\!]*?[^<>]*?>@si', '', $str);

Den fjernede jo al html, så det er kun det korte resume der kommer med. Det burde jo være den lange linkreference.
Avatar billede phpbegynder2004 Nybegynder
10. marts 2007 - 13:29 #5
Jeg har selv prøvet at lave noget kode. Det virker udemærket, men det kan måske gøres bedre?
$str = preg_replace('@<a href=[^>](.*?)\"\>.*?</a>@si', "\\1", $str);
Avatar billede jakobdo Ekspert
11. marts 2007 - 10:05 #6
En nem måde at omgå det på, er ved først at formattere output, når det skal vises!
Så gemmer du altså http://www.noget.dk i databasen!
Men når det printes, så bliver det til et link.
Smart ikke? :o)

(Det koster lidt ekstra databehandling)
Avatar billede phpbegynder2004 Nybegynder
11. marts 2007 - 23:30 #7
Okay, tak for det!
Avatar billede jakobdo Ekspert
12. marts 2007 - 07:57 #8
Takker for point.
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