REGEX: ich suche eine RegEx

#1
Moin HaBo,

ich muss ganz ehrlich zugeben, dass ich ein absoluter RegEx-n00b bin und es auch nach 2 Stunden Buch studieren einfach nicht so recht Ralle. Folgendes Problem:

gegeben:

PHP:
$var = "Dies ist eine Einleitung. Hier nun eine Liste:
<ul>
<li>narf</li>
<li>narf 2</li>
</ul>
Hier folgt nun der weitere Text.

Alles schön mit leerzeilen getrennt...";

echo(nl2br($var));
Nun möchste ich im Grunde den nl2br nicht löschen, aber ich möchte AUCH nicht, dass er mit nach jedem umbruch, der HTML enthält einen <br /> setzt. das sieht dann nämlich so aus:
PHP:
nl2br($var) = "Dies ist eine Einleitung. Hier nun eine Liste:<br />
<ul><br />
<li>narf</li><br />
<li>narf 2</li><br />
</ul><br />
Hier folgt nun der weitere Text.<br />
<br />
Alles schön mit leerzeilen getrennt...";
Das sieht im Browser natürlich schlecht aus und der code ist dann auch alles, aber nicht valid HTML. Nunja, ich bräuchte also einen Regex der mit zeilenumbrüche im bereich <ul> bis </ul> löscht, aber die anderen unangetastet lässt...

wenn wer eine Idee hat, wär ich suuuuper-dankbar.

2 kleinigkeiten noch:
- Das ergebnis muss hoch-performant sein. 1000 gleichzeitige nutzer ist keine seltenheit und trotzdem soll das sys nicht in die knie gehen...
- eine Doku dazu (bzw kommentare) wären super-toll, damit ich vielleicht auch watt davon lernen kann...


herzlichsten Dank schonmal...
 
G

Gulliver

Guest
#2
suche nach dem <ul> blabla </ul> block.

<ul>.*</ul>

Dann hast du in $_ zb alles was zwischen <ul> und </ul> steht.
Danach kannste die var nehmen und bequem alles rauskicken was du magst.

in Perl würde ein substitute etwa so aussehen : s/\n//g

Vielleicht schreibst nochmal in welcher Sprache du das machst ;)

mfg
 
#3
Code:
preg_replace("/(<\/?(ul|li|ol)(.+[^>])?>)<br \/>/Uis", "\\1", nl2br($var));
oder

Code:
str_replace(array("<ul><br />", "<li><br />", "</ul><br />", "</li><br />"), array("<ul>", "<li>", "<ul>", "<li>"), nl2br($var));


ich würde den ersten regexp bevorzugen, da er auch tags mit eigenschaften berücksichtigt, während das einfache str_replace dies nicht berücksichtigen kann und auch langsamer ist.

ps. ehm du wolltest eine kommentierung...

(<\/?(ul|li|ol)(.+[^>])?>)<br \/>

suche nach < mit optional folgendem /.
danach muss entweder ul oder li oder ul folgen.
optional dürfen jetzt belibiege zeichen folgen, die aber nicht > enthalten dürfen.
dann wird ein ><br /> erwartet.

die äussere klammer "matcht" einen teil des suchstrings. es ist immer der html-tag vor dem zeilenumbruch. den gefundenen gesamtstring ersetzen wir durch genau diesen "match". soll heissen: es bleibt immer nur der tag übrig, der hier in klammern auch beliebig erweitert werden kann durch weitere tags (ul, li, ol)
 
#4
Original von maedmexx
Code:
str_replace(array("<ul><br />", "<li><br />", "</ul><br />", "</li><br />"), array("<ul>", "<li>", "<ul>", "<li>"), nl2br($var));
Oh man(n), wie peinlich... Da hätt ich aber auch selbst drauf kommen können... herzlichsten dank!

es dreht sich (natürlich) um PHP
 
Oben