/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Regexp til at fjerne quotes fra phpbb
Fra : Leif Neland


Dato : 24-11-08 15:01

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 slut.

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



 
 
Martin Larsen (25-11-2008)
Kommentar
Fra : Martin Larsen


Dato : 25-11-08 22:19

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

Leif Neland (26-11-2008)
Kommentar
Fra : Leif Neland


Dato : 26-11-08 02:22

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-slut.

Så det er virkelig en regexp-udfordring

Indtil videre erstatter jeg [quote...] med <div style='display:none'> og
[/quote....] med </div>.

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


(*) <div style='height: 90px; overflow:hidden;'
onMouseOver='this.style.height=""' onMouseOut='this.style.height="90px"'>

Leif

Martin Larsen (26-11-2008)
Kommentar
Fra : Martin Larsen


Dato : 26-11-08 10:22

Leif Neland wrote:

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

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 (11-12-2008)
Kommentar
Fra : Martin Larsen


Dato : 11-12-08 00:35

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

Søg
Reklame
Statistik
Spørgsmål : 177549
Tips : 31968
Nyheder : 719565
Indlæg : 6408820
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste