Avatar billede Bjarne Novice
27. april 2005 - 19:53 Der er 29 kommentarer og
1 løsning

HTML tags med php

Jeg sidder og roder med online redigering af artikler. Jeg blokere html-tags. Men jeg vil dog gerne have, så man bl.a. kan skrive med fed, kursiv og understreget. Jeg har set andre sider, hvor man skal skrive fx fed tekst, som bliver afviklet som en fed tekst.

Hvordan gør man?
Avatar billede mikze Nybegynder
27. april 2005 - 20:00 #1
Så kan du bare lave en str_replace som replacer til <b> og til </b>
Avatar billede mikze Nybegynder
27. april 2005 - 20:01 #2
$tekst = str_replace('[b]', '<b>', $_POST[tekst]);

Eller sådan noget, den der funktion der :-)
Avatar billede Slettet bruger
27. april 2005 - 20:17 #3
$temp1 = array("", "", "", "", "", "");
$temp2 = array("<br>", "<em>", "<u>", "</b>", "</em>", "</u>");
$tekst = str_replace($temp1, $temp2, $_POST['tekst']);
Avatar billede mikze Nybegynder
27. april 2005 - 20:39 #4
Ja lidt ala mit :-)

$temp1 = array("", "", "", "", "", "");
$temp2 = array("<b>", "<i>", "<u>", "</b>", "</i>", "</u>");
$tekst = str_replace($temp1, $temp2, $_POST['tekst']);

Lille rettelse, og så skal dit tekst-input være i $_POST['tekst'] og det som sættes ind i mysql skal så være $tekst :-)

En lille rettelse, eller sådan jeg ville gøre anyways.

Kan du egentlig fortælle hvad <em> gør nu vi er igang? :-P
Avatar billede Slettet bruger
27. april 2005 - 20:53 #5
<em> gør _præcis_ det samme som <i>, derfor vil jeg måske ikke rette det, da der jo ingen forskel er.

Jeg til gengæld har rettet din $_POST[tekst] til $_POST['tekst'], da dette er den korrekte syntaks.
Avatar billede Bjarne Novice
28. april 2005 - 08:03 #6
oki, ja det vil jeg lige prøve. Jeg skal også have en funktion, så man kan se et preview af hvad man laver. Men det kan man vel lave med sessions?

Hvis nu man skal indsætte et billede, fx [image="http://sti" align="left/right"]
Hvordan gør man så?
Avatar billede Slettet bruger
28. april 2005 - 08:57 #7
wicez og mikze -> Hvorfor grave et hul med et ske når man nu her en spade?
(Hvorfor gøre det med ren PHP der nu er indbygget RegExp?)

bjarne003 -> Til sådan et formål bruger man regexp:

<?php
$string = "boldbold-italicunderlined";
$newstring = preg_replace("/\\[(\\/?[biu])]/i", "<\\1>", $string);
?>

Den erstatter:
[B][I][U][/B][/I][/U] med tilsvarende HTML-tags..
Avatar billede Bjarne Novice
28. april 2005 - 10:38 #8
preg_replace("/\\[(\\/?[biu])]/i", "<\\1>", $string); forstår jeg ikke meget af. Hvad betyder ("/\\[(\\/?[biu])]/i", "<\\1>"?
Avatar billede Slettet bruger
28. april 2005 - 10:45 #9
første funktionsargument, /\\[(\\/?[biu])]/i
betyder:
find tegnet [ efterfulgt af 0 eller 1 skråstreger efterfulgt af enten b, i eller u, efterfulgt af tenget ]. Gem den eventueller skråstreg og bogstavet i hukkommelsesplads nr. 1. Der tages ikke højde for store/små bogstaver.

andet funktionsargument, <\\1>
betyder:
Erstat det du fandt før med tegnet < efterfulgt af det er er i hukommelsesplads nr. 1, efterfulgt af tegnet >.



Det er det der heddder regular expressions, som du kan læse mere om her: http://regular-expressions.org/

Det bliver brugt til at søge (og erstatte) i tekst man ikke helt ved hvordan ser ud, men kan opstille nogle regler for. Det er faktisk meget simplet når man har lært syntaxen...

:)
Avatar billede Slettet bruger
28. april 2005 - 16:08 #10
Gartzen: php's indbyggede funktion er hurtigere end at bruge reg exp. Derfor.!
Avatar billede Slettet bruger
28. april 2005 - 16:26 #11
Wicez -> Du kan jo selv prøve:

<?php
$string = "boldbold-italicunderlined";
$loops = 100000;
$start = microtime(true);
for ($n = 1; $n < $loops; $n++) {
    $temp1 = array("", "", "", "", "", "");
    $temp2 = array("<b>", "<i>", "<u>", "</b>", "</i>", "</u>");
    $tekst = str_replace($temp1, $temp2, $string);
    unset($temp1);
    unset($temp2);
    unset($tekst);
}
$end = microtime(true);
echo "Normal done in ".($end - $start)." seconds\n";
$start = microtime(true);
for ($n = 0; $n < $loops; $n++) {
    $newstring = preg_replace("/\\[(\\/?[biu])]/i", "<\\1>", $string);
    unset($newstring);
}
$end = microtime(true);
echo "RegExp done in ".($end - $start)." seconds\n";
?>

;))


Man kan selvfølgelig rette lidt på din version og lade være med at bruge $temp1 og $temp2 til at gemme array'erne i, men hardcode dem direkte ind i funktionen.. Det vil give yderligere performace, og så er de to metoder lige hurtige. (Varierer selvfølgelig efter system og tilfældighed..!) men man vil hurtigt miste overblikket over funktionen om ca 5 yderligere HTML-tags..
Hvorimod regexp-versionen er noget nemmere at udvide..

Men jeg skal da ikke bestemme noget, jeg skriver bare hvad jeg finder bedst/mest logisk til formålet.. :)

(På min 1GHz PII Win XP er resultatet:
Normal done in 10.898219823837 seconds
RegExp done in 5.7476480007172 seconds)
Avatar billede Bjarne Novice
28. april 2005 - 16:53 #12
Jeg kan se RegExp er hurtigst, så det vil jeg gerne bruge. Men hvordan gør jeg med billederne? [image="http://sti" align="left/right"]?
Avatar billede Slettet bruger
28. april 2005 - 17:05 #13
sådan her:
$string2 = preg_replace("/\\[image=\"(.*)\" align=\"(left|right)\"/i", "<img src=\"\\1\" align=\"\\2\"", $string);

(utestet)
Avatar billede Bjarne Novice
28. april 2005 - 18:41 #14
kan lige så godt være ærlig og sige, at jeg ikke lige kan se systemet i det. Men lige nu ser koden til at vise et billede på min hjemmeside sådan ud:

<div id="floatright/floatleft"><img src="sti"  border="1" /><br /><div id="billedetekst">Tekst til billede</div></div>

Så altså [image="sti" align="left/right" pictext="Tekst til billede"]

Ved align skal man således kunne bestemme om #floatright eller #floatleft skal bruges.
Avatar billede Slettet bruger
28. april 2005 - 19:54 #15
Sådan her:

<?php
$search = "/\\[image=\"(.*)\" align=\"(left|right)\" pictext=\"(.*)\"]/i";
$replace = "<div id=\"float\\2\"><img src=\"\\1\" border=\"1\" \\/><br \\/><div id=\"billedetekst\">\\3<\\/div><\\/div>";
$nytekst = preg_replace($search, $replace, $tekst);
?>
Avatar billede Bjarne Novice
28. april 2005 - 20:42 #16
hmz. Ja det virker, supr. Kunne vel ikke overtale dig til at koge det sammen med de andre funktioner? Altså [b] = <b>, [u] = <u>, [i] = <i>, [p] = <p>,
= <div align=center>,
= </div>

Jeg har været inde på http://dk2.php.net/preg_replace men jeg har ikke helt styr på funktionen endnu.
Avatar billede Slettet bruger
28. april 2005 - 20:51 #17
http://dk2.php.net/preg_replace viser dig kun hvordan du afvikler et stykke RegExp fra PHP.. RegExp er et helt sporg for sig selv som du kan lære her: http://regular-expressions.org/

Til <div align="center"> ville jeg nok bruge str_replace som også har været omtalt her i tråden før..

Men hvis du så skal have det hele kogt sammen, bliver det vel til noget ala det her:

<?php
function convertCode($tekst) {
  $tekst = preg_replace("/\\[(\\/?[biup])]/i", "<\\1>", $string);
  $tekst = preg_replace("/\\[image=\"(.*)\" align=\"(left|right)\" pictext=\"(.*)\"]/i", "<div id=\"float\\2\"><img src=\"\\1\" border=\"1\" \\/><br \\/><div id=\"billedetekst\">\\3<\\/div><\\/div>", $tekst);
  $tekst = str_replace(array("
", "
"), array("<div align=\"center\">", "</div>") $tekst);
  return $tekst;
}
?>

Overstående kode skal bare indsættes 1 gang på din side. (Evt. inkluderes med require()?)
så kan du nemlig bare gøre sådan her:
$nytekst = convertCode($gammeltekst);
Avatar billede Slettet bruger
28. april 2005 - 20:55 #18
Måske du skulle lave en div for hvert symbol, og så lave det med css i stedet?
Avatar billede Slettet bruger
28. april 2005 - 20:56 #19
Btw mente jeg en <span>, jeg tror også at du vil bruge en <span> i stedet for at bruge en <div>
Avatar billede Slettet bruger
28. april 2005 - 20:59 #20
wicez -> Ikke når der nu kan være <p>-elementer i.... Så skal det jo være div, da span er inline og div er block..
Avatar billede Slettet bruger
28. april 2005 - 21:01 #21
Jep. Jeg ved ikke hvad jeg tænkte på, det en centreret tekst jo ligeså godt kan være <div> :o)
Avatar billede Slettet bruger
28. april 2005 - 21:03 #22
yep :)
Avatar billede Bjarne Novice
28. april 2005 - 21:16 #23
Jeg får en fejl i denne linje: $tekst = str_replace(array("
", "
"), array("<div align=\"center\">", "</div>") $tekst);

Parse error: parse error, unexpected T_VARIABLE in /sti on line 13
Avatar billede Slettet bruger
28. april 2005 - 21:17 #24
du mangler komma efter "</div>")
Avatar billede Slettet bruger
28. april 2005 - 21:18 #25
$tekst = str_replace(array("
", "
"), array("<div align=\"center\">", "</div>"), $tekst);
Avatar billede Slettet bruger
28. april 2005 - 21:24 #26
sorry :)
Avatar billede Bjarne Novice
28. april 2005 - 21:44 #27
der var lige nogle småting som ikke virkede korrekt:

function convertCode($tekst) {
  $tekst = preg_replace("/\\[(\\/?[biup])]/i", "<\\1>", $tekst);
  $tekst = preg_replace("/\\[image=\"(.*)\" align=\"(left|right)\" pictext=\"(.*)\"]/i", "<div id=\"float\\2\"><img src=\"\\1\" border=\"1\" /><br /><div id=\"billedetekst\">\\3</div></div>", $tekst);
  $tekst = str_replace(array("
", "
"), array("<div align=\"center\">", "</div>"), $tekst);
  return $tekst;
}

Men der er et lille problem: Hvis man skriver i en bagvendt rækkefølge går det galt. Hvis fx man skriver [image="http://volieren.dk/top.jpg" pictext="hej" align="left"] i stedet for [image="http://volieren.dk/top.jpg" align="left" pictext="hej"] går det galt. Så udskrives [image="http://volieren.dk/top.jpg" pictext="hej" align="left"], koden bliver altså ikke afviklet. Kan det løses?
Avatar billede Slettet bruger
28. april 2005 - 23:08 #28
Ja det kan det godt:

function convertCode($tekst) {
  $tekst = preg_replace("/\\[(\\/?[biup])]/i", "<\\1>", $tekst);
  $tekst = preg_replace("/\\[(?:(?:(?:image=\"(.*)\")|(?:align=\"(left|right)\" ?)|(?:pictext=\"(.*)\")) ?){3,3}]/", "<div id=\"float\\2\"><img src=\"\\1\" border=\"1\" /><br /><div id=\"billedetekst\">\\3</div></div>", $tekst);
  $tekst = str_replace(array("
", "
"), array("<div align=\"center\">", "</div>"), $tekst);
  return $tekst;
}

Nu er det ligegyldigt hvilken rækkefølge du skriver image, pictext og align i. :)
Den var lidt svær at knække, da jeg ikke er særlig god til RegExp.. Men det virker da som det skal ;)
Avatar billede Bjarne Novice
29. april 2005 - 13:00 #29
99% perfekt:P

Hvis jeg eksempelvis skriver [image="sti"] udskrives [image="sti"]. Altså hvis man ikke udfylder alle punkterne bliver det ikke afviklet. Vil meget gerne have så man ikke nødvendigvis skal udfylde alle felter (image="" skal selvfølgelig udfyldes).

Jeg synes sq du er skide god til det. Jeg er sat af med RegExp. Synes simplethen det ligner en gang volapyk:)
Avatar billede Bjarne Novice
19. maj 2005 - 17:27 #30
lukket:)
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