[PHP] bij het parsen een \n toevoegen aan de code

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Schonhose
  • Registratie: April 2000
  • Laatst online: 17-09 20:01

Schonhose

Retro Icoon

Topicstarter
Ik ben bezig met het schrijven van een parser in PHP welke een aantal tags vervangd door HTML.

Probleem is alleen dat wanneer ik

code:
1
2
3
[quote]
Dit is een quote
[/quote]


parse met wat ik geschreven heb dat het niet helemaal lekker werkt. Dit komt door de \n (of te wel <BR> ) na de [quote ] tag. Daar hou ik geen rekening mee zodat de uiteindelijke html wat terug komt is:

code:
1
2
3
4
<blockquote>
<br />
Dit is een quote<br />
</blockquote>


Alleen ik weet niet in welke richting ik het moet zoeken om die \n mee te nemen zodat die eerste <br /> (direct na de blockquote) weg is.

PHP:
1
2
$news = preg_replace("#\\[quote\](.*?)\\[/quote\]#si",
 "<blockquote>\\1<br /></blockquote>", $news);


edit:
TS iets aangepast zodat het duidelijker is

[ Voor 19% gewijzigd door Schonhose op 19-06-2004 01:01 ]

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


Acties:
  • 0 Henk 'm!

Verwijderd

als je nu eens regext op:

[ quote ]\n(.*?)[/quote] :D

dus je hebt dan 2 regexes.. niet echt mooi... maargoed..

[ Voor 35% gewijzigd door Verwijderd op 18-06-2004 19:55 ]


Acties:
  • 0 Henk 'm!

  • Schonhose
  • Registratie: April 2000
  • Laatst online: 17-09 20:01

Schonhose

Retro Icoon

Topicstarter
Verwijderd schreef op 18 juni 2004 @ 19:55:
als je nu eens regext op:

[ quote ]\n(.*?)[ /quote ] :D

dus je hebt dan 2 regexes.. niet echt mooi... maargoed..
Hoe moet ik dat invoegen in het laaste php statement?

PHP:
1
2
$news = preg_replace("#\\[quote\]\n(.*?)\\[/quote\]#si", 
"<blockquote>\\1</blockquote>", $news);


werkt niet....

* Schonhose is wat confused want dit is nieuw voor hem.

[ Voor 21% gewijzigd door Schonhose op 18-06-2004 20:04 ]

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
<?
$news = preg_replace("#\\[quote\]\\n(.*?)\\[/quote\]#si", 
"<blockquote>\\1</blockquote>", $news);
?> 
Je moet \n escapen omdat dit al door PHP wordt gezien als een linebreak (correct me if im wrong :P)

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
Om te beginnen: zo'n newline character noteer je als \n en niet anders. Is het nou echt zo moeilijk om gewoon de correcte spellingswijze over te nemen van alle honderden PHP tutorials en manuals waarin het goed gespeld wordt? Het komt zo dom over dat ik al gelijk een beetje moedeloos wordt als ik je topicstart lees.

Meer concreet: in het voorbeeld dat je geeft staat zowel voor als na de regel tekst een newline. Hoe komt het dat je alleen de eerste newline vervangt door <br>? En wat heeft jouw reguliere expressie ermee te maken? Die vervangt namelijk helemaal geen \n door <br> (er staat alleen toevallig een <br> hardcoded in). Zorg dat je je zaken op orde hebt als je hier een vraag komt stellen, want de situatie die je schetst is zo inconsistent dat ik al weet dat 'ie niet klopt.

Nu hopelijk een beetje constructief commentaar (;)): het is vaak makkelijker om een ingewikkelde transformatie niet met een enkele ingewikkelde reguliere expressie op te lossen, maar het probleem stapsgewijs op te lossen. Je gebruikt dan bijvoorbeeld alleen een reguliere expressie om de tekst tussen de quote tags uit te halen (iets met [quote](.*?)[/quote] dus), haal van het resultaat met trim ofzo de newline characters links en rechts weg, en haal de boel vervolgens door nl2br om de <br>-tags toe te voegen. Vervolgens kun je de string construeren door er <blockquote>-tags omheen te zetten.

offtopic:
Hoe kan ik tekst schrijven die niet door React geparsed wordt, zodat ik in het voorbeeld hierboven [_quote][/quote] kan schrijven zonder underscore? Ik meende dat daar een speciale tag voor was, maar geen idee welke...

edit:
Ah, met 'norml'-dus. Tnx nescafe!

[ Voor 40% gewijzigd door Soultaker op 18-06-2004 21:21 ]


Acties:
  • 0 Henk 'm!

  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 18:12
[quote][/quote]

Zijnde [norml][quote][/quote][/norml] ;)

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


Acties:
  • 0 Henk 'm!

  • Schonhose
  • Registratie: April 2000
  • Laatst online: 17-09 20:01

Schonhose

Retro Icoon

Topicstarter
Soultaker schreef op 18 juni 2004 @ 21:02:
Om te beginnen: zo'n newline character noteer je als \n en niet anders. Is het nou echt zo moeilijk om gewoon de correcte spellingswijze over te nemen van alle honderden PHP tutorials en manuals waarin het goed gespeld wordt? Het komt zo dom over dat ik al gelijk een beetje moedeloos wordt als ik je topicstart lees.
Weet je waar ik moedeloos van wordt? Van dat muggenzifterij. Ooit wel eens bij stil gestaan dat ik misschien de laatste half uur voor de TS alleen maar gewerkt heb met de " /" i.vm. met HTML en dat ik dan om die reden per ongeluk deze weer gebruik wanneer ik "\n" bedoel?
Meer concreet: in het voorbeeld dat je geeft staat zowel voor als na de regel tekst een newline. Hoe komt het dat je alleen de eerste newline vervangt door <br>? En wat heeft jouw reguliere expressie ermee te maken? Die vervangt namelijk helemaal geen \n door <br> (er staat alleen toevallig een <br> hardcoded in). Zorg dat je je zaken op orde hebt als je hier een vraag komt stellen, want de situatie die je schetst is zo inconsistent dat ik al weet dat 'ie niet klopt.
Op basis van een door mij gemiste <br /> tag is mijn vraag al helemaal inconsistent? En je weet dus al dat het niet klopt. Das mooi.... lees dan ook vooral niet verder wanneer ik zo meteen de oplossing geef. Die wel mooi werkt met mijn "inconsistente" situatie.

Mocht je toch nog doorlezen, kom dan maar even van je voetstuk af want zoveel weet je eigenlijk ook weer niet. Het komt zo dom over dat je niet weet hoe je moet zoeken want een simpele zoektocht in de FAQ van GoT had je de oplossing gegeven hoe je gebruik kunt maken van de [norml] tag.

Aangezien zoeken dus niet je sterkste kant is (leuk he, vooroordelen) zal ik het nog even quoten:

code:
1
[norml] [b] hoi [/b] [/norml] RML tags tussen [norml] tags worden niet verwerkt
Nu hopelijk een beetje constructief commentaar (;)): het is vaak makkelijker om een ingewikkelde transformatie niet met een enkele ingewikkelde reguliere expressie op te lossen, maar het probleem stapsgewijs op te lossen. Je gebruikt dan bijvoorbeeld alleen een reguliere expressie om de tekst tussen de quote tags uit te halen (iets met [quote](.*?)[/quote] dus), haal van het resultaat met trim ofzo de newline characters links en rechts weg, en haal de boel vervolgens door nl2br om de <br>-tags toe te voegen. Vervolgens kun je de string construeren door er <blockquote>-tags omheen te zetten.
Tja, wat kan ik hier van zeggen: ik heb je post gelezen en ben er mee aan de slag gegaan, maar het was veel te omslachtig. Gelukkig lopen er ook nog mensen met verstand van zaken rond zoals Ibex. O+

Deze wist me te vertellen dat er in textareas geen \n maar een \r\n werd toegevoegd. Waarschijnlijk staat ook dit wel ergens vermeld in de vele tutorials over PHP (je kent ze wel, daar staat ook in dat het \n is). ;)

Na deze informatie en mijn eigen kennis samengevoegd te hebben kwam ik uit op het volgende statement om het geheel goed te parsen:

PHP:
1
2
$news = preg_replace("#\\[quote\]\r\n(.*?)\\[/quote\]#si",
"<blockquote>\\1<br /></blockquote>", $news);


En zo werkt mijn "inconsistente" oplossing naar alle tevredenheid.

@Stoel, I'm correcting you, want je zat even fout. Je hoeft een \n niet te escapen omdat ie anders naar "\n" opzoek gaat als zijnde tekst.

[ Voor 4% gewijzigd door Schonhose op 19-06-2004 00:01 ]

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Schonhose schreef op 18 juni 2004 @ 23:55:
Weet je waar ik moedeloos van wordt? Van dat muggenzifterij. Ooit wel eens bij stil gestaan dat ik misschien de laatste half uur voor de TS alleen maar gewerkt heb met de " /" i.vm. met HTML en dat ik dan om die reden per ongeluk deze weer gebruik wanneer ik "\n" bedoel?

Op basis van een door mij gemiste <br /> tag is mijn vraag al helemaal inconsistent? En je weet dus al dat het niet klopt. Das mooi.... lees dan ook vooral niet verder wanneer ik zo meteen de oplossing geef. Die wel mooi werkt met mijn "inconsistente" situatie.
Ehm, rustig. Soultaker zegt terecht dat je TS rammelt als je dingen vergeet die wel degelijk van belang zijn. Bovendien is de oplossing die hij vervolgens noemt al een stuk beter dan wat er tot dan toe gesuggereerd is in dit topic.
Schonhose schreef op 18 juni 2004 @ 23:55:
Tja, wat kan ik hier van zeggen: ik heb je post gelezen en ben er mee aan de slag gegaan, maar het was veel te omslachtig. Gelukkig lopen er ook nog mensen met verstand van zaken rond zoals Ibex. O+

Deze wist me te vertellen dat er in textareas geen \n maar een \r\n werd toegevoegd. Waarschijnlijk staat ook dit wel ergens vermeld in de vele tutorials over PHP (je kent ze wel, daar staat ook in dat het \n is). ;)
Bullshit. Op een Windows systeem is het \r\n, op een *nix systeem is het \n, en zo kunnen er nog andere mogelijkheden zijn. Heeft niets maar dan ook niets met een textarea te maken.
Schonhose schreef op 18 juni 2004 @ 23:55:
Na deze informatie en mijn eigen kennis samengevoegd te hebben kwam ik uit op het volgende statement om het geheel goed te parsen:

PHP:
1
2
$news = preg_replace("#\\[quote\]\r\n(.*?)\\[/quote\]#si",
"<blockquote>\\1<br /></blockquote>", $news);


En zo werkt mijn "inconsistente" oplossing naar alle tevredenheid.
Zo werkt ie inderdaad op jouw server naar alle tevredenheid. Tot je je site migreert naar een Linux server, dan doet je hele quote systeem het ineens niet meer.

PHP:
1
2
$news = preg_replace("#\\[quote\][\r\n]{0,2}(.*?)\\[/quote\]#si",
"<blockquote>\\1<br /></blockquote>", $news);

Dat werkt al veel beter. Nou pakt ie het ook als er geen enter staat, en bovendien werkt ie op servers die welke combinatie van \r of \n dan ook gebruiken.

[ Voor 7% gewijzigd door NMe op 19-06-2004 00:10 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 18:26

crisp

Devver

Pixelated

Dat een textarea altijd \r\n teruggeeft bij een nieuwe regel is correct*, maar jouw regexp gaat toch echt stuklopen op:
[quote]en meteen tekst er achteraan[/quote]
een trim over de stuk text vind ik persoonlijk ook mooier; kijk eens naar preg_replace_callback

*NMe84: ook vanaf een client onder linux geeft een textarea \r\n terug voor linebreaks in een textarea, dat is namelijk een vaste afspraak.

[ Voor 44% gewijzigd door crisp op 19-06-2004 00:17 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
Schonhose schreef op 18 juni 2004 @ 23:55:
Weet je waar ik moedeloos van wordt? Van dat muggenzifterij. Ooit wel eens bij stil gestaan dat ik misschien de laatste half uur voor de TS alleen maar gewerkt heb met de " /" i.vm. met HTML en dat ik dan om die reden per ongeluk deze weer gebruik wanneer ik "\n" bedoel?
Het spijt me als ik je zo moet wakkerschudden, maar als je niet gestructureerd kunt werken dan zul je nooit leren programmeren. Ik breng het misschien wat cru, maar dat neemt niet weg dat zorgvuldig opschrijven wat je bedoelt essentieel is om een fatsoenlijk werkend algoritme te schrijven.

Er is ook altijd nog dit punt: als je al niet de moeite neemt om dingen bij hun naam te noemen of je topic start na te lezen op dit soort vergissingen, dan vraag ik me ook af of je de tijd en moeite die de andere bezoekers besteden om jouw te helpen wel genoeg waardeert.
Op basis van een door mij gemiste <br /> tag is mijn vraag al helemaal inconsistent? En je weet dus al dat het niet klopt. Das mooi.... lees dan ook vooral niet verder wanneer ik zo meteen de oplossing geef. Die wel mooi werkt met mijn "inconsistente" situatie.
Het ging om meer dan "een gemiste <br/ > tag"; sterker nog, daar heb ik je niet op gewezen. Je invoervoorbeeld klopt niet met je uitvoervoorbeeld, en de code die je erbij geeft correspondeert niet met het uitvoervoorbeeld. Met andere woorden: het is niet mogelijk om met de code die je geeft van de invoer die je geeft naar de uitvoer die je geeft te komen. Dat is incosistent.

Ik moet trouwens kwijt dat ik de opzet van je topicstart op zichzelf erg goed vond, omdat je duidelijk aangaf wat de invoer, de programmacode, de verwachte uitvoer én de huidige uitvoer was. Daar kunnen sommige andere mensen nog wat van leren. Dat neemt niet weg dat als die gegevens simpelweg niet kloppen (en dat kon ik dus al zien aan de onderlinge inconsistentie) de kwaliteit van de topicstart toch achteruit gaat.

Ik geloof best dat je uiteindelijk een werkende oplossing krijgt. Dat heeft verder niets te maken met of je originele code consistent was of niet.
Aangezien zoeken dus niet je sterkste kant is (leuk he, vooroordelen) zal ik het nog even quoten:
code:
1
[norml] [b] hoi [/b] [/norml] RML tags tussen [norml] tags worden niet verwerkt
Dank je wel, hoor, maar dat had nescafe dus al verteld. Het mag trouwens wel iets minder cynisch.
Tja, wat kan ik hier van zeggen: ik heb je post gelezen en ben er mee aan de slag gegaan, maar het was veel te omslachtig. Gelukkig lopen er ook nog mensen met verstand van zaken rond zoals Ibex. O+
Dat is ook niet erg dankbaar. Verder heb ik geen post van Ibex gezien in dit topic :?
Deze wist me te vertellen dat er in textareas geen \n maar een \r\n werd toegevoegd. Waarschijnlijk staat ook dit wel ergens vermeld in de vele tutorials over PHP (je kent ze wel, daar staat ook in dat het \n is). ;)

Na deze informatie en mijn eigen kennis samengevoegd te hebben kwam ik uit op het volgende statement om het geheel goed te parsen:
PHP:
1
2
$news = preg_replace("#\\[quote\]\r\n(.*?)\\[/quote\]#si",
"<blockquote>\\1<br /></blockquote>", $news);

En zo werkt mijn "inconsistente" oplossing naar alle tevredenheid.
Ik ging er van uit dat je wel meerdere regels in een quote zou willen handhaven. Je bent je er trouwens van bewust dat deze oplossing alleen werkt als er direct een newline na de [quote]-tag staat? Met andere woorden, als ik deze code schrijf:
code:
1
[quote]Hallo![/quote]

Of, zelfs deze:
code:
1
2
3
[quote] 
De regel hierboven eindigt met een spatie.
[/quote]
Dan wordt er niets vervangen.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

crisp schreef op 19 juni 2004 @ 00:11:
*NMe84: ook vanaf een client onder linux geeft een textarea \r\n terug voor linebreaks in een textarea, dat is namelijk een vaste afspraak.
:o Weer wat geleerd.

Neemt niet weg dat mijn regexp al een stuk flexibeler is, en daardoor ook op andere dingen toe te passen is. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
crisp schreef op 19 juni 2004 @ 00:11:
*NMe84: ook vanaf een client onder linux geeft een textarea \r\n terug voor linebreaks in een textarea, dat is namelijk een vaste afspraak.
De HTTP POST specificatie zegt inderdaad dat er \r\n (in bytes: 13 10) over het netwerk verstuurd wordt, maar het zou me niets verbazen als PHP dat onder Windows interpreteert als een enkel newline karakter. Iemand met een PHP install onder Windows om dat te verifiëren?

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 18:26

crisp

Devver

Pixelated

Soultaker schreef op 19 juni 2004 @ 00:17:
[...]

De HTTP POST specificatie zegt inderdaad dat er \r\n (in bytes: 13 10) over het netwerk verstuurd wordt, maar het zou me niets verbazen als PHP dat onder Windows interpreteert als een enkel newline karakter. Iemand met een PHP install onder Windows om dat te verifiëren?
Ik heb dat toevallig van de week lopen testen en onder windows krijg ik ook CRLF (dus 2 bytes) terug per enter, ook vanaf een linux client.

[ Voor 3% gewijzigd door crisp op 19-06-2004 00:20 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
Ok, da's dan duidelijk. :)

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 18:26

crisp

Devver

Pixelated

nog even een voorbeeld met preg_replace_callback:

PHP:
1
2
3
4
5
6
7
$news = preg_replace_callback('/\\[quote\](.*?)\\[\/quote\]/si', 'quote', $news);

function quote($matches) {

  return '<blockquote>'.nl2br(trim($matches[1])).'</blockquote>';

}

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Schonhose
  • Registratie: April 2000
  • Laatst online: 17-09 20:01

Schonhose

Retro Icoon

Topicstarter
Soultaker schreef op 19 juni 2004 @ 00:14:
Dank je wel, hoor, maar dat had nescafe dus al verteld. Het mag trouwens wel iets minder cynisch.
Dat dacht ik ook toen ik jouw posting las.....
Dat is ook niet erg dankbaar. Verder heb ik geen post van Ibex gezien in dit topic :?
Naast GoT zijn er ook andere manieren om te communiceren. En dankbaar? Vijftig procent van je posting besteed je om mij af te kraken en zitten vol met vooroordelen. De oplossing met de trim is inderdaad zo slecht nog niet getuige je onderstaande opmerking. Hier had ik even niet aangedacht.... maar dat neemt niet weg dat ik nog steeds van mening ben dat je conclusies trekt die je niet mag trekken...
Ik ging er van uit dat je wel meerdere regels in een quote zou willen handhaven. Je bent je er trouwens van bewust dat deze oplossing alleen werkt als er direct een newline na de [ quote ]-tag staat? Met andere woorden, als ik deze code schrijf:
code:
1
[quote]Hallo![/quote]

Of, zelfs deze:
code:
1
2
3
[quote] 
De regel hierboven eindigt met een spatie.
[/quote]
Dan wordt er niets vervangen.
Hmmm, das wel een goed punt wat je daar aandraagt. Dan zou idd een trim oplossing van jou en wat Crisp ook zegt beter werken.

Back 2 the drawing board dan maar weer.

[edit]
@Crisp:

Das wel een interessante functie want ik was me al aan het afvragen hoe ik de trim moest gaan verwerken. In mijn geval is die nl2br niet nodig op deze plaats want dit doe ik op de hele message na het parsen.

Ik ga dit eens even testen.

[edit2]
Works like a charm...

Leuke dingen geleerd zo uit 1 topic \o/

offtopic:
Toch in meerdere gevallen een nuttig topic met nuttige info ;)

[ Voor 20% gewijzigd door Schonhose op 19-06-2004 00:41 ]

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Heren, houden we het aub vriendelijk? De discussie an sich is best interessant, zou jammer zijn als we die door moddergooien verpesten okee? :) De slash was een foutje, ja, kunnen we nu weer over tot de orde van de dag ;)

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
offtopic:
Jouw modbreaks worden ook steeds uitgebreider gedecoreerd he, curry684 :+

Acties:
  • 0 Henk 'm!

  • Schonhose
  • Registratie: April 2000
  • Laatst online: 17-09 20:01

Schonhose

Retro Icoon

Topicstarter
Na wat uitgebreider testen blijkt dat er geen rekening gehouden wordt met een [quote ] in een [quote ].

Eens kijken hoe ik dit kan oplossen.... Suggestions are appreciated. :)

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


Acties:
  • 0 Henk 'm!

  • Ibex
  • Registratie: November 2002
  • Laatst online: 18:03

Ibex

^^ met stom.

Voor het hele quote-systeem heb ikzelf het volgende bedacht. Ik schrijf het eventjes hier neer, want op msn heb je geen handige highlighting :).

Wanneer een gebruiker op de quote-knop klikt, wordt de desbetreffende quote uit de database gehaalt, en word deze door de volgende functie gehaald:
PHP:
1
2
3
4
5
6
function filterquote($var) {
  $var = preg_replace("/(\\[quote)(=)?([^\]]*)(\])((.|\n)*?)(\\[\/quote\])/i",
                      "[...]",
                      $var);
  return $var;
}
Let wel dat deze code rekening houd met een quote-formaat van [quote] blaat [/quote], of met een formaat van [quote=info] blaat [/quote]. De info dient omdat ik op die manier de posternaam en en de tijd van de gequote tekst kan meegeven.

Vervolgens voeg ik er [quote=info] voor, en plak er [/quote] achter. De info haal ik dan op vanuit de database.
Op deze manier is het bericht gequoted, en zijn alle quotes die in het oorsprongkelijke bericht voorkwamen vervangen door [...].

Wanneer de text wordt geparsed, haal ik deze door de ubb-parser (die ik zelf aan het schrijven ben.). De volgende functie zorgt ervoor dat de quote mooi tevoorschijn komt.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function parseubb($var) {
  $var = preg_replace("/\\[quote(=)?([^·]+?)·([^·]+?)·([^\]]+?)\]/i",
                      "<br />\n<h4 class=\"inspring\">".
                      "Quote van \\2 op \\3 om \\4:</h4>".
                      "<br />\n<div class=\"accent inspring\">\n",
                      $var);
  // ^^^ de code voor formaat [quote=poster·postdatum·posttijd] blaat [/quote]
  $var = preg_replace("/\\[quote\]/i",
                      "<br />\n<h4 class=\"inspring\">Quote:</h4>".
                      "<br />\n<div class=\"accent inspring\">\n",
                      $var);
  // ^^^ de code voor formaat [quote] blaat [/quote]
  $var = preg_replace("/\\[\/quote\]/i", "</div>", $var);
  // ^^^ de code voor de [/quote]
}
Deze code gaat uit van de opmaak: [quote=poster·postdatum·posttijd] blaat [/quote] en van de opmaak [quote] blaat [/quote]. Daarom dus de 2 reguliere expressies.

Op deze manier staat een quote in een div, en heb je geen last van als de gebruiker dan toch persé een quote in een quote nest. Deze zal dan mooi geparsed worden. Maar normaal zal dat niet voorkomen, als de gebruiker gewoon gebruik maakt van de quote-knop, want daar worden alle quotes uit het oorsprongkelijke bericht gefilterd, wat dus geneste quotes tegengaat.

Hier nog eventjes de css van de desbetreffende div's:
Cascading Stylesheet:
1
2
3
4
5
6
7
8
9
10
11
12
div.inspring {
  margin-left: 50px;
}
div.accent {
  background-color: <? echo $bgcolormed.";\n"; ?>
  padding: 10px;
  border-bottom: 1px solid <? echo $border.";\n"; ?>
  border-top: 1px solid <? echo $border.";\n"; ?>
}
h4.inspring {
  margin-left: 50px;
}
Let hierbij even niet op de php in de css; dit komt omdat de cssfile bij mij een .php is waaraan ik dan parameters kan meegeven om kleuren dynamisch mee te geven.

Ik hoop dat je het een beetje snapt, en anders kom je maar op msn langs :)

[ Voor 71% gewijzigd door Ibex op 19-06-2004 10:39 . Reden: beter code, css, anti-layout-verneuking, ... ]

Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be


Acties:
  • 0 Henk 'm!

  • Ibex
  • Registratie: November 2002
  • Laatst online: 18:03

Ibex

^^ met stom.

Ik weet het, een dubbelpost, maar ik wil bovenstaande een beetje los houden met onderstaande reacties :)
NMe84 schreef op 19 juni 2004 @ 00:08:
Bullshit. Op een Windows systeem is het \r\n, op een *nix systeem is het \n, en zo kunnen er nog andere mogelijkheden zijn. Heeft niets maar dan ook niets met een textarea te maken.
[...]
Zo werkt ie inderdaad op jouw server naar alle tevredenheid. Tot je je site migreert naar een Linux server, dan doet je hele quote systeem het ineens niet meer.
Ik werk nochtans op een Linux systeem, en kom dus wel degelijk \r\n tegen. Hmz, zoals Crips Crisp ( :> ) dus al zei :)
Soultaker schreef op 19 juni 2004 @ 00:14:
Dat is ook niet erg dankbaar. Verder heb ik geen post van Ibex gezien in dit topic :?
Msn dus :)

Nuja, al bij al deed deze post er niet zoveel meer toe, behalve wat herhalen :/

[ Voor 30% gewijzigd door Ibex op 19-06-2004 13:07 . Reden: ik blijk 11 te spuiten ]

Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Schonhose schreef op 19 juni 2004 @ 10:12:
Na wat uitgebreider testen blijkt dat er geen rekening gehouden wordt met een [ quote] in een [ quote],

Eens kijken hoe ik dit kan oplossen.... Suggestions are appreciated. :)
Een quote in een quote weergeven kan alleen als je een stack-based parser gebruikt, regular expressies hebben die kracht niet. Als je per se regular expressions wil blijven gebruiken, dan is de code die Ibex je gaf inderdaad de beste. :)

Psssst Ibex, het is crisp, niet crips. ;)

[ Voor 4% gewijzigd door NMe op 19-06-2004 12:19 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Download het mooie scriptje van oisyn's website, ben je in 1 klap klaar

Acties:
  • 0 Henk 'm!

  • Schonhose
  • Registratie: April 2000
  • Laatst online: 17-09 20:01

Schonhose

Retro Icoon

Topicstarter
Verwijderd schreef op 19 juni 2004 @ 12:20:
Download het mooie scriptje van oisyn's website, ben je in 1 klap klaar
Er kon geen gebruiker met de ingevoerde nickname worden gevonden.
(interne identificatie: search::find::no_user_found_topicstarter)
Linkje?

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
offtopic:
Tis toch .oisyn? Let op de punt.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 18:26

crisp

Devver

Pixelated

Voor een geneste quote kan je in een reguliere expressie recursie gebruiken:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$news = preg_replace_callback('/\[quote]((([^[]|\\[(?!\/?quote))*|(?R))*)\\[\/quote]/is', 'quote', $news);

function quote($matches) {

  $content = $matches[1];

  // toggle genest of geneste quotes vervangen door [...]
//  $content = preg_replace_callback('/\[quote]((([^[]|\\[(?!\/?quote))*|(?R))*)\\[\/quote]/is', 'quote', $content);
  $content = preg_replace('/\[quote]((([^[]|\\[(?!\/?quote))*|(?R))*)\\[\/quote]/is', '<br />[...]<br />', $content);

  // vervang [img]-tags door [url=...]afbeelding[/url]
  $content = preg_replace('/\\[img\](http:\/\/)?(.*?)\\[\/img\]/i', '<a href="http://$2" target="_blank">afbeelding</a>', $content);
  $content = preg_replace('/\\[img=([0-9]{1,3}),([0-9]{1,3})\](http:\/\/)?(.*?)\\[\/img\]/i', '<a href="http://$4" target="_blank">afbeelding</a>', $content);

  return '<blockquote>quote:<hr width="100%" size="1" color="#808080" />'.$content.'<hr width="100%" size="1" color="#808080" /></blockquote>';

}

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
Pagina: 1