Nu prøver jeg så at få dem sat sammen, sådan at den kører scriptet igennem først, for at finde special kodning, og i $text i databasen, har jeg noget test, og så nogle tags der hedder [phpcode][/phpcode] med kode imellem.
Målet er så, at den kører igennem for special tags, udskifter hvor nødvendigt, og sætter koden imellem [phpcode][/phpcode] i en highlight_string, sådan at den får syntax highlight på. :)
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
Det kan du ikke :-P Som udgangspunkt er folk mongoler.. De laver fx nice[/i] <- doh! Men du kan da prøve.. Jeg vil gøre sådan her:
<?
function bbcode($starttag, $content, $endtag) { // hvis der er fejl i tagsne, fx starter med [b] og slutter med [i]: if ($starttag != $endtag) return $content;
switch ($starttag) { case 'b': return "<b>$content</b>"; case 'i': return "<i>$content</i>"; case 'u': return "<u>$content</u>"; case 'phpcode': return highlight_string($content, true); } } function bbcode2html($text) { return nl2br(preg_replace("#\[([a-z]+)](.+)\[/([a-z]+)]#Ues", "bbcode('\\1','\\2','\\3')", $text)); }
$text = ' her er noget [b]php kode: [phpcode] <? function max($a, $b) { return $a > $b ? $a : $b; } ?> [/phpcode]';
Jeg tror bare du skal tilføjse modifiereren "s" i dit regulære udtryk.. Hvis det altså er fordi den ikke matcher noget. For der ser ikke ud til at være noget galt med det.
----------------------- Dette er så et lille stykke kode jeg har brygget sammen over natten, for lige at teste databasen, og så hvordan den håndterer phpkode, samt hvordan jeg får det til at se pænt ud på siden. :)
1
Fortæl mig hvad i syntes. :) - Admin ----------------------------------------------
hmm det har kan jeg ikke helt blive klog på... virker som om at ved at rykke str_replace("[phpcode].... og str_replace("[/phpcode .... uden for foreach løkken, så virker det. :S
Jf. min første post, skal du bruge preg_replace med e modifier (evt. preg_replace_callback).. Den gør det du ønsker, men ordentligt, det der er åndsvagt
Det har jeg jo fortalt dig 4 gange nu, hvordan du gør..
function bbcode($starttag, $content, $endtag) { // hvis der er fejl i tagsne, fx starter med [b] og slutter med [i]: if ($starttag != $endtag) return $content;
switch ($starttag) { case 'b': return "<b>$content</b>"; case 'i': return "<i>$content</i>"; case 'u': return "<u>$content</u>"; case 'phpcode': return highlight_string($content, true); } } function bbcode2html($text) { return nl2br(preg_replace("#\[([a-z]+)](.+)\[/([a-z]+)]#Ues", "bbcode('\\1','\\2','\\3')", $text)); }
Sad og læstepå php net, efter en eventuel løsning... fandt dette:
People using the /e modifier with preg_replace should be aware of the following weird behaviour. It is not a bug per se, but can cause bugs if you don't know it's there.
The example in the docs for /e suffers from this mistake in fact.
With /e, the replacement string is a PHP expression. So when you use a backreference in the replacement expression, you need to put the backreference inside quotes, or otherwise it would be interpreted as PHP code. Like the example from the manual for preg_replace:
To make this easier, the data in a backreference with /e is run through addslashes() before being inserted in your replacement expression. So if you have the string
He said: "You're here"
It would become:
He said: \"You\'re here\"
...and be inserted into the expression. However, if you put this inside a set of single quotes, PHP will not strip away all the slashes correctly! Try this:
print ' He said: \"You\'re here\" '; Output: He said: \"You're here\"
This is because the sequence \" inside single quotes is not recognized as anything special, and it is output literally.
Using double-quotes to surround the string/backreference will not help either, because inside double-quotes, the sequence \' is not recognized and also output literally. And in fact, if you have any dollar signs in your data, they would be interpreted as PHP variables. So double-quotes are not an option.
The 'solution' is to manually fix it in your expression. It is easiest to use a separate processing function, and do the replacing there (i.e. use "my_processing_function('\\1')" or something similar as replacement expression, and do the fixing in that function).
If you surrounded your backreference by single-quotes, the double-quotes are corrupt: $text = str_replace('\"', '"', $text);
People using preg_replace with /e should at least be aware of this.
I'm not sure how it would be best fixed in preg_replace. Because double-quotes are a really bad idea anyway (due to the variable expansion), I would suggest that preg_replace's auto-escaping is modified to suit the placement of backreferences inside single-quotes (which seemed to be the intention from the start, but was incorrectly applied).
Så i bund og grund, er det det der e du har i #Ues der smider \ ind foran ". :S
Brug preg_replace_callback så.. Det er det samme som /e, men der skal du ikke escape noget. Der er argumentet til funktionen arrayet med backreferencerne i
Det er preg_replace_callback jeg har problemer med.. kan ikke få den til at acceptere bbcode('\\1', '\\2') den skriver at nummer 2 skal være et gyldigt argument.
Min kode ser sådan her ud:
function bbcode($starttag, $content) {
switch ($starttag) { case 'b': $content = "<b>$content</b>"; break; case 'i': $content = "<i>$content</i>"; break; case 'u': $content = "<u>$content</u>"; break; case 'phpcode': $content = highlight_string($content, true); break; }
.. Har du overvejet at kigge i PHPs manual? Du bruger jo preg_replace_callback forkert.
Det kan vel ikke være så svært.. Brug den her funktion, den er nogenlunde ordentlig, så kan du vel selv regne ud hvordan du tilføjer bbkoder eller ændrer dem jeg har lavet i forvejen?:
// put atributterne i et array: $attributes = array(); preg_match_all("#\b([a-z]+)\s*=\s*(\"|'|)(.+?)\\2\s#s", $m[2]." ", $attra); $length = count($attra[1]); for($i = 0; $i < $length; $i++) $attributes[$attra[1][$i]] = $attra[3][$i];
// find ud af hvilket tag der er brugt: switch ($m[1]) { case 'a': $html = "<a"; if ($attributes['color']) $html .= " style='color:".$attributes['color']."'"; if ($attributes['href']) $html .= " href='".$attributes['href']."'"; $content = $html.">".$content."</a>"; break; case 'b': $content = "<b>$content</b>"; break; case 'i': $content = "<i>$content</i>"; break; case 's': $content = "<strike>$content</strike>"; break; case 'u': $content = "<u>$content</u>"; break; case 'phpcode': return highlight_string($content, true); // return fordi vi ikke vil have nestede tags break; }
// check om der er nestede tags: return bbcode2html($content); } /** * funktionen laver bbcode om til html **/ function bbcode2html($text) { return preg_replace_callback("#\[([a-z]+)([^\]]*)](.+)\[/\\1]#Us", bbcode, $text); }
$text = ' her er et [a href= http://www.mailbasen.dk/ color="red" ]link[/a], det er der ikke [s]her[/s]. her er [i]noget[/u] php kode: [phpcode] <? function max($a, $b) { return $a > $b ? $a : $b; } ?> [/phpcode]';
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.