|
| ereg_replace problemer Fra : Jeppe Vesterbæk |
Dato : 08-09-02 13:57 |
|
Til bl.a. forums bruger jeg ereg_replace til "mini-html". En bruger kan
f.eks. skrive tekst... som så bliver ændret til <b>tekst...</b> via
$t = ereg_replace("\(.*)\","<b>\\1</b>", $t); //FED
Nu vil jeg dog også gerne have noget java-syntax-markup hvis brugeren
skriver [java]tekst...[/java]. Jeg har med hjælp her fra gruppen fundet
noget kode der klarer dette. Mit problem er bare, at jeg ikke kan kalde
denne funktion (java) fra ereg_replace, altså noget ala:
$t = ereg_replace("\[java](.*)\[/java]", "<pre>" . java('\\1') . "</pre>",
$t); //java-markup
Dette virker ikke. Laver jeg min funktion java til kun at indeholde
function java ($t) {
die($t);
}
så bliver "\1" udskrevet.
Hvad er det lige, jeg gør galt?
/Jeppe
| |
Peter Brodersen (08-09-2002)
| Kommentar Fra : Peter Brodersen |
Dato : 08-09-02 16:56 |
|
On Sun, 8 Sep 2002 14:57:07 +0200, "Jeppe Vesterbæk"
<mail[REMOVE-XXXXXXXXXX]@jhv.dk> wrote:
>Til bl.a. forums bruger jeg ereg_replace til "mini-html". En bruger kan
>f.eks. skrive tekst... som så bliver ændret til <b>tekst...</b> via
>
>$t = ereg_replace("\(.*)\","<b>\\1</b>", $t); //FED
Bemærk, at det vil opføre sig uhensigtsmæssigt, hvis man fx har tekst
i stil med:
Dette er fed tekst.
Jeg vil anbefale at bruge preg, samt en lazy regex her:
$t = preg_replace("_\[b\](.*?)\[/b\]_","<b>\\1</b>", $t); //FED
>$t = ereg_replace("\[java](.*)\[/java]", "<pre>" . java('\\1') . "</pre>",
>$t); //java-markup
java('\\1') bliver ikke behandlet af regex'en. En mulighed her er at
bruge preg's e-modifier, der evaluerer string'en. Fx:
$t = preg_replace("_\[java\](.*?)\[/java\]_e","'<pre>'.java('\\1').
'</pre>'", $t);
Så burde det virke som du vil have det.
--
- Peter Brodersen
| |
Jeppe Vesterbæk (08-09-2002)
| Kommentar Fra : Jeppe Vesterbæk |
Dato : 08-09-02 17:16 |
|
Hej Peter
> Bemærk, at det vil opføre sig uhensigtsmæssigt, hvis man fx har tekst
> i stil med:
>
> Dette er fed tekst.
>
> Jeg vil anbefale at bruge preg, samt en lazy regex her:
>
> $t = preg_replace("_\[b\](.*?)\[/b\]_","<b>\\1</b>", $t); //FED
Ok, det havde jeg ikke lige tænkt på. Da regular expressions er noget helt
nyt for mig, valgte jeg ereg_replace da den umiddelbart så lidt nemmere ud
en preg_replace.
> java('\\1') bliver ikke behandlet af regex'en. En mulighed her er at
> bruge preg's e-modifier, der evaluerer string'en. Fx:
>
> $t = preg_replace("_\[java\](.*?)\[/java\]_e","'<pre>'.java('\\1').
> '</pre>'", $t);
Dette virker hvis jeg skriver [java]noget tekst...[/java], men det virker
ikke over flere linier, altså ala
[java]noget
tekst...[/java]
Her bliver det ikke fanget, og der står bare [java]...
Tak for hjælpen
/Jeppe
| |
Peter Brodersen (08-09-2002)
| Kommentar Fra : Peter Brodersen |
Dato : 08-09-02 18:02 |
|
On Sun, 8 Sep 2002 18:15:48 +0200, "Jeppe Vesterbæk"
<mail[REMOVE-XXXXXXXXXX]@jhv.dk> wrote:
>Ok, det havde jeg ikke lige tænkt på. Da regular expressions er noget helt
>nyt for mig, valgte jeg ereg_replace da den umiddelbart så lidt nemmere ud
>en preg_replace.
De fleste ereg_replace-udtryk kan snildt omskrives til preg_replace.
Der skal blot en delimiter på før og efter udtrykket, hvor jeg har
brugt _, idet du ikke bruger dette tegn i dit udtryk.
ereg-udgaven: \(.*)\","<b>\\1</b>
bliver altså til preg-udgaven: _\(.*)\","<b>\\1</b>_
Den eneste egentlige ændring er, at dit udtryk er gået fra at være
grådigt: (.*) - til at være lazy: (.*?)
Jeg mener ikke at lazy udtryk er muligt uden videre for ereg.
Derudover har jeg så tilføjet et par ekstra backslashes foran dine ].
Ikke strengt nødvendigt, men om ikke andet vil jeg ikke personligt
komme i tvivl, hvis jeg hurtigt skal skimme udtrykket om fx nogle
måneder (og udtrykket i øvrigt var noget større).
>> $t = preg_replace("_\[java\](.*?)\[/java\]_e","'<pre>'.java('\\1').
>> '</pre>'", $t);
>
>Dette virker hvis jeg skriver [java]noget tekst...[/java], men det virker
>ikke over flere linier, altså ala
>[java]noget
> tekst...[/java]
>Her bliver det ikke fanget, og der står bare [java]...
.. matcher som udgangspunkt ikke en newline i preg. Det er der endnu en
modifier (s), der kan sørge for, så den kan vi lige tilføje. Det
gælder i øvrigt også for [b]-udtrykket. De to udtryk bliver således
til:
// Fed tekst
$t = preg_replace("_\[b\](.*?)\[/b\]_s","<b>\\1</b>", $t); //FED
// Java
$t = preg_replace("_\[java\](.*?)\[/java\]_es","'<pre>'.java('\\1').
'</pre>'", $t);
--
- Peter Brodersen
| |
Jeppe Vesterbæk (08-09-2002)
| Kommentar Fra : Jeppe Vesterbæk |
Dato : 08-09-02 19:31 |
|
> . matcher som udgangspunkt ikke en newline i preg. Det er der endnu en
> modifier (s), der kan sørge for, så den kan vi lige tilføje. Det
> gælder i øvrigt også for [b]-udtrykket. De to udtryk bliver således
> til:
Super, det virker jo bare ...
Mange tak for hjælpen.
/Jeppe
| |
Jesper Brunholm (09-09-2002)
| Kommentar Fra : Jesper Brunholm |
Dato : 09-09-02 13:09 |
|
Jeppe Vesterbæk wrote:
> Til bl.a. forums bruger jeg ereg_replace til "mini-html". En bruger kan
> f.eks. skrive tekst... som så bliver ændret til <b>tekst...</b> via
>
> $t = ereg_replace("\ (.*)\","<b>\\1</b>", $t); //FED
Undskyld hvis jeg spørger dumt, men var det ikke smartere at bruge
str_replace - så vidt jeg umiddelbart kan dechiffrere så tager du ikke
højde for at man skal kunne skrive style ind i dine html-tags, så der er
vel ikke væsentlig varians i fra- og til-taggene?
mvh
Jesper Brunholm
--
Phønix - dansk folk-musik fra unge musikere - http://www.phonixfolk.dk
| |
Peter Brodersen (09-09-2002)
| Kommentar Fra : Peter Brodersen |
Dato : 09-09-02 19:45 |
|
On Mon, 09 Sep 2002 14:08:45 +0200, Jesper Brunholm
<nospam@brunholm-scharff.dk> wrote:
>> $t = ereg_replace("\(.*)\","<b>\\1</b>", $t); //FED
>Undskyld hvis jeg spørger dumt, men var det ikke smartere at bruge
>str_replace - så vidt jeg umiddelbart kan dechiffrere så tager du ikke
>højde for at man skal kunne skrive style ind i dine html-tags, så der er
>vel ikke væsentlig varians i fra- og til-taggene?
Man sikrer om ikke andet, at man kun starter fed tekst, hvis den
bliver lukket efterfølgende. En tekst som:
"Det er fedt og det bliver bare [b]ved"
.... skal ikke have fed tekst startet i slutningen, idet den så blot
ville kunne fortsætte ud på resten af siden.
--
- Peter Brodersen
| |
|
|