php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
[REGEX] doppelte umbrüche nicht erwünscht ....


 
Abraxax
04-12-2005, 13:16 
 
nun habe ich mal wieder was zum kopfzerbrechen für euch.

gegeben ist bb-code. der einfachheit halber beschränken wir uns mal auf [B ].

das ist ja der allgemeine standard dafür '!\[b\](.+)\[\/b\]!siU'

nun ist es aber so, wenn der user folgendes eingibt .... [b ]blah

blub[/ b ]

wird der html-code invalide ....<p><strong>blah</p><p>blub</strong></p>
*zum hintergrund: ein doppelter break (also 2x enter für einen absatz) erzeugt auch einen korrekten absatz im template. 1x enter erzeugt entsprechend auch nur ein '<br />\n'.

wie kann ist es nun machen, dass bb-code-tags, in denen sich ein doppelter umbruch befindet, nicht mehr gefunden werden.

das sind meine bisherigen versuche. aber so optimal ist das auch nicht wirklich.

'!\[b\]([^(\n\n|\r\r|\r\n\r\n)]+)\[\/b\]!siU'

'!\[b\]([^(\\n\\n|\\r\\r|\\r\\n\\r\\n)]+)\[\/b\]!siU'

'!\[b\]([^(\\\n\\\n|\\\r\\\r|\\\r\\\n\\\r\\\n)]+)\[\/b\]!siU'


mal sehen, wer sich ein glas bier verdienen kann... ;) abzuholen in neuss... :D

 
asp2php
04-12-2005, 13:44 
 
hm ... versteh' ich deine Ersetzung nicht ganz ...

z.B. für den o.a. einfachen Fall hast du den Text in $1 stehen wie kommt's, dass es so raus kommt:

<p><strong>blah</p><p>blub</strong></p>

und nicht

<p class="clsstrong">blah</p><p class="clsstrong">blub</p>

:p :p

 
Abraxax
04-12-2005, 13:50 
 
bei der ausgabe des textes im template wird \n\n durch </p><p> ersetzt.

das template weiss von [b ] usw nichts. das muss es auch nicht wissen.

nur der validator von w3c meckert halt zurecht. und ich will ihm alles recht machen. weiss aber noch nicht genau wie. :-P

 
Benny-one
04-12-2005, 14:26 
 
darf man davon ausgehen, dass nur folgender fall auftreten kann, bei dem KEIN <b> </b> gesetzt werden soll:

TextText\n\nTextText

d.h. es taucht niemals
TextText\n\n\nTextText
oder
\n\nTextText
oder
TextText\n\n

auf?

alternativ könntest du erst \n\n durch <p> ersetzen und dann im RegEx leichter <p> ausschließen.

 
Abraxax
04-12-2005, 14:36 
 
doch. ich weiss nicht, wie oft der user enter drückt. daher kann ich nichts ausschliessen, ausser am anfang und am ende des strings. das wird eh abgeschnitten. ;-)

ich habe jetzt noch folgendes ausprobiert .... "!\[b\]([^\n]+)\[\/b\]!siU" ... das klappt auch. aber es sollen halt keine einfachen \n ausgeklammert werden, sondern nur doppelte \n\n.

das beste, was ich mir noch überlegt habe, ist, wenn man [b ]blah\n\nblub[/b ] durch [b ]blah[/b ]\n\n[b ]blub[/b ] ersetzen könnte. dann ist der user auch nicht verwirrt, was da passiert ist und der html-code ist immer noch valide.

 
ghostgambler
04-12-2005, 20:11 
 
"!\[b\]([^\n]{2,})\[\/b\]!siU"
*ganz dumm das + nach {2,} geändert hat*

 
Abraxax
04-12-2005, 20:37 
 
leider klappt das auch nicht so ganz, wie ich es erhofft habe. aus ...

[b ]das ist der erste teil in bold

und hier der zweite teil[/b ]

[b ]sadsdk[/b ]ljsakldjsakldj jlsj lkjd kjsf [i ]kldsf
dlfjdsölfjdsljflkdsjfkdsjflkjdsfds
fdsfjdskljflksdjflksjfdslf
sads[/i ]adsadasdsadsa

... wird nur ....

[b ]das ist der erste teil in bold

und hier der zweite teil[/b ]

<strong>sadsdk</strong>ljsakldjsakldj jlsj lkjd kjsf [i ]kldsf
dlfjdsölfjdsljflkdsjfkdsjflkjdsfds
fdsfjdskljflksdjflksjfdslf
sads[/i ]adsadasdsadsa

d.h. er hat zwar das bold nicht genommen, wo \n\n enthalten war, jedoch auch gleich das das italic ignoriert, wo nur 1x \n pro zeile enthalten war. das italic muss natürlich geparst werden können.

weitere ideen? wo ist eigentlich REX ? ;)

* RegEx -> wau wau -> derHund *

 
ghostgambler
04-12-2005, 22:10 
 
du hast dir aber auch echt ein Problem rausgepickt :mad:
*locker 25 Minuten jetzt an der Lösung gesessen hat*

aber es funktioniert :D

*auf Anhang deutet*

 
Abraxax
04-12-2005, 23:36 
 
hey danke dir. aber es ist nicht korrekt ... :p

<strong>das ist der erste teil in bold
und hier der zweite teil</strong>
<strong>das ist der erste teil in bold

und hier der zweite teil</strong>
<strong>das ist der erste teil in bold


und hier der zweite teil</strong>

<strong>sadsdk</strong>ljsakldjsakldj jlsj lkjd kjsf <italic>kldsf
dlfjdsölfjdsljflkdsjfkdsjflkjdsfds
fdsfjdskljflksdjflksjfdslf
sads</italic>adsadasdsadsa

das rote zeug hätte nicht auftauchen dürfen. denn hier sind ja definitiv 2x \n dazwischen.

sobald \n\n zwischen den tags ist, darf es nicht geparst werden. wird es aber bei deinen code. oder ist bei dir die ausgabe anders als bei mir?

\n\n\n würde in meinem fall zu </p><p><br /> oder <br /></p><p> (weiss grad nicht wie rum, ist aber egal)

\n wird zu <br />

\n\n zu </p><p>

wenn ich den block ans template gebe, wird dort entsprechend der rest (also die n-mal \n ) ersetzt. da habe ich im code keinen einfluss. und das template weiss vom bb code nichts. ,-)


wo ist rex, wenn man ihn braucht .... :D

 
ghostgambler
04-12-2005, 23:39 
 
ehm...also bei mir ist die Ausgabe korrekt?

http://83.135.99.185/test2.php

(und ich hab nix mehr dran gemacht ... ist allerdings auch brandneu-php 5.1.1 und demnach eventuell auch ne neue pcre-lib :\ )

 
Abraxax
04-12-2005, 23:44 
 
mhm. ich habe kein php 5 auf der maschine. dann mag es daran liegen.
mal sehen wann der wauwau kommt... :)

 
Abraxax
05-12-2005, 00:00 
 
fein. icq sei dank. ;-)

@all
mit "#\[b\](([^\n]|\n(?!(\r\n|\n)))*)\[\/b\]#siU" klappt es nun.


w3c freut sich nun auch wieder. ;-)

This Page Is Valid XHTML 1.1!

falls noch jemand eine idee oder lust hat ... wenn man, bevor alles als bb-code geparst wird, noch prüfen und ersetzen kann, dass die tags vor \n\n|\r\n\r\n entsprechend geschlossen und danach wieder öffnen, wäre ich auch nicht abgeneigt. ;)

 
ghostgambler
05-12-2005, 00:07 
 
Original geschrieben von Abraxax
falls noch jemand eine idee oder lust hat ... wenn man, bevor alles als bb-code geparst wird, noch prüfen und ersetzen kann, dass die tags vor \n\n|\r\n\r\n entsprechend geschlossen und danach wieder öffnen, wäre ich auch nicht abgeneigt. ;)

preg_replace_callback?
wenn richtig angegangen, ist das sogar nichtmal DER overkill für deine Seite :D
(ein preg_replace_callback auf alle Tags gleichzeitig, und die Funktion erkennt Tag und macht das mit dem close/open)

 
Abraxax
05-12-2005, 00:12 
 
das muss ich mir mal in ruhe zu gemüte führen. ;-)

 
ghostgambler
05-12-2005, 00:26 
 
Original geschrieben von Abraxax
fein. icq sei dank. ;-)

@all
mit "#\[b\](([^\n]|\n(?!(\r\n|\n)))*)\[\/b\]#siU" klappt es nun.
und noch eine Erleuchtung (ich WAR schon im Bett :D)

"#\[i\](([^\n]|(\n\r|\n)(?!(\r\n|\n)))*)\[\/i\]#siU"
sollte gehen und packt das richtige \r
*nicht mehr getestet hat, weil apache schon aus ist*


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:13 Uhr.