Regexp til at fjerne quotes fra phpbb

This is a discussion on Regexp til at fjerne quotes fra phpbb within the Produktion af websider ved brug af php (dk.edb.internet.webdesign.serverside.php) forum.

Regexp til at fjerne quotes fra phpbb

Postby Leif Neland on Mon Nov 24, 2008 7:00 am

Jeg vil fjerne det citerede fra posts skrevet i phpbb.

En post kan have formatet
"[quote:uid=navn]blablabla[/quote:uid]
Ja det synes jeg også"

uid er 8 bytes hex.

Så kan man lave en regexp. der fjerner alt mellem [quote...] og /quote...]?

Problemer:
A: Der behøver ikke være "=navn"

B: Quotes kan være nestet, og der kan være flere i samme msg.
For nemheds skyld bruger jeg ">" og "<" som quotestart og *.

Format 1: > blabla > yadayada < mumle < yapyap => yapyap
Format 2 > blabla < yadayada > mumle < yapyap => yadayada yapyap

Så det duer ikke bare at fjerne alt fra den første > til den sidste <

Kan man det i rexexp, eller skal man til at programmere manuelt i
strengsøgningsrutiner?

Leif


Leif Neland
 
Posts: 83
Joined: Sun May 30, 2004 6:31 am

Re: Regexp til at fjerne quotes fra phpbb

Postby Martin Larsen on Tue Nov 25, 2008 2:19 pm

Hej Leif

> uid er 8 bytes hex.

Altså fx: [quote:12345ABC=batman]dadada[/quote:12345ABC] ?

> Problemer:
> A: Der behøver ikke være "=navn"
> B: Quotes kan være nestet, og der kan være flere i samme msg.

Hvis vi går ud fra uid er unik (deraf navnet), så er det ikke et problem
at de er nestede, idet regexen så vil søge fra startquouten til den
tilsvarende slutquote.

Heller ikke det valgfrie =navn er et problem.

Dette burde kunne gøre det:

\[quote:([0-9A-F]{8})(=\w+)?].*?\[/quote:\1]

Det sidste spørgsmålstegn er ikke strengt nødvendigt men kan løse nogle
problemer med fx genbrug af uid i samme indlæg, og måske også snavs med
ukorrekt nestede quotes etc.

Og i PHP:

$regex = '\[quote:([0-9A-F]{8})(=\w+)?].*?\[/quote:\1]';
$text = preg_replace("|$regex|is", '', $text);
echo $text; //Nu med quotes fjernede

Hilsen
Martin
Martin Larsen
 
Posts: 60
Joined: Thu Jul 19, 2007 4:14 pm

Re: Regexp til at fjerne quotes fra phpbb

Postby Leif Neland on Tue Nov 25, 2008 6:21 pm

Martin Larsen skrev:
> Hej Leif
>
>> uid er 8 bytes hex.
>
> Altså fx: [quote:12345ABC=batman]dadada[/quote:12345ABC] ?
>
> > Problemer:
> > A: Der behøver ikke være "=navn"
> > B: Quotes kan være nestet, og der kan være flere i samme msg.
>
> Hvis vi går ud fra uid er unik (deraf navnet), så er det ikke et problem
> at de er nestede, idet regexen så vil søge fra startquouten til den
> tilsvarende slutquote.
>
> Heller ikke det valgfrie =navn er et problem.
>
> Dette burde kunne gøre det:
>
> \[quote:([0-9A-F]{8})(=\w+)?].*?\[/quote:\1]
>
> Det sidste spørgsmålstegn er ikke strengt nødvendigt men kan løse nogle
> problemer med fx genbrug af uid i samme indlæg, og måske også snavs med
> ukorrekt nestede quotes etc.
>
> Og i PHP:
>
> $regex = '\[quote:([0-9A-F]{8})(=\w+)?].*?\[/quote:\1]';
> $text = preg_replace("|$regex|is", '', $text);
> echo $text; //Nu med quotes fjernede

Jeg fik skrevet lidt forkert af.
uid er 10 tegn, og desværre er uid'en IKKE unik, den er den samme for
alle tags i den besked. Måske er det for at kunne styre når man
inkluderer en besked i en anden...
Og navn er omgivet af ""
Så jeg lavede regexp om til dette:
$regex = '\[quote:([0-9A-F]{10})(="\w+")?].*?\[/quote:\1]';

Her er en rigtig tekst.

- - - - - - - -
[quote:c9add63da0="leif"][quote:c9add63da0="Aarhus"][quote:c9add63da0="Djursland"]...
...tekst på niveau 3.[/quote:c9add63da0]
...tekst på niveau 2
[/quote:c9add63da0]

...tekst på niveau 1
[/quote:c9add63da0]
Tekst, der ikke er quotet
- - - - - - - - - - - -
Resultatet er, at der kun bliver fjertet fra det første quote-start til
og med det første quote-*.

Så det er virkelig en regexp-udfordring :-)

Indtil videre erstatter jeg [quote...] med
og
[/quote....] med
.

Så bliver quotes skjult, men jeg ville helst have fjernet quotes helt,
så jeg kunne nøjes med at vise de første 200 ord...

Det kan også klares med css(*), men det virker nu lidt dumt at sende
ting, der ikke skal vises


(*)
onMouseOver='this.style.height=""' onMouseOut='this.style.height="90px"'>

Leif
Leif Neland
 
Posts: 83
Joined: Sun May 30, 2004 6:31 am

Re: Regexp til at fjerne quotes fra phpbb

Postby Martin Larsen on Wed Nov 26, 2008 2:21 am

Leif Neland wrote:

> Resultatet er, at der kun bliver fjertet fra det første quote-start til
> og med det første quote-*.

Den simple løsning vil være at fjerne non-greedy operatoren ? så der i
stedet står:

\[quote:([0-9A-F]{10})(="\w+")?].*\[/quote:\1]

Det virker korrekt i dit eksempel.

Men hvis der starter en ny uafhængig quote efter den uqoutede tekst, vil
den uquotede tekst blive ædt.


Derfor vil jeg foreslå at æde quotes "indefra" med dette regex:

\[quote:([0-9A-F]{10})(="\w+")?](?!.*\[quote).*?\[/quote:\1]

Det vil fjerne fra det inderste niveau og udad. Der skal så bare laves
en lille løkke som æder dem alle:

$regex= '\[quote:([0-9A-F]{10})(="\w+")?](?!.*\[quote).*?\[/quote:\1]';
$quotefound=1;
while($quotefound) $text = preg_replace("|$regex|is", '', $text, -1,
$quotefound);

Jeg har prøvet forskellige kombinationer, og det ser ud til at virke på
dem alle.

Martin
Martin Larsen
 
Posts: 60
Joined: Thu Jul 19, 2007 4:14 pm

Re: Regexp til at fjerne quotes fra phpbb

Postby Martin Larsen on Wed Dec 10, 2008 4:35 pm

Hej Leif

Har du prøvet om regexp'et virker?

Det skulle jeg mene, men jeg er da nysgerrig efter om mine anstrengelser
har båret frugt :-)

Martin
Martin Larsen
 
Posts: 60
Joined: Thu Jul 19, 2007 4:14 pm


Return to Produktion af websider ved brug af php (dk.edb.internet.webdesign.serverside.php)

Who is online

Users browsing this forum: No registered users and 0 guests