[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
REDAXO Forum • [solved] RegEx Hilfe benötigt
Seite 1 von 1

[solved] RegEx Hilfe benötigt

Verfasst: 19. Sep 2013, 13:21
von RexDude
Hallo,

vielleicht kann mir einer von euch bei folgendem RegEx helfen?

Aus dem String sollen folgendes enfernt werden: Leere Paragraphen-Tags, leere Paragraphen-Tags mit   sowie BRs die mehrfach hintereinander vorkommen (mit oder ohne Zeilenumbruch dazwischen). Also das hier muss alles raus (nur die 3 Ps foo/bar/batz müssen bleiben):

Code: Alles auswählen

<p></p>

<p></p>

<p>foo</p>

<p>&nbsp;</p>
<p>&nbsp;</p>

<p>bar<br />
bar</p>

<br />

<br />

<p>batz</p>

<br>
<br>
Das ganze ist für das CKEditor-Modul und sieht gerade unschönerweise und ohne die Berücksichtigung der BRs so aus: https://github.com/RexDude/ckeditor/blo ... ut.php#L19

Das RegEx sollte also mit JS laufen, aber ich glaube das ist ja eh sprachunabhängig, oder?

Danke :)

Re: RegEx Hilfe benötigt

Verfasst: 19. Sep 2013, 17:43
von Xong
Hi Rudi,

versuch´s mal damit:

Code: Alles auswählen

// match all tags except lonely <br />s outside of any elements ;-(
data = data.match(/(<(?!br)(\w)[^>]*>(.*?<\/\2>)?)/igm).join("\n");
// replace empty paragraphs
data = data.replace(/(<p>(\s|&nbsp;)*<\/p>)/igm, ''); 

Re: RegEx Hilfe benötigt

Verfasst: 20. Sep 2013, 10:18
von RexDude
Hi Robert,

vielen Dank für deine Hilfe :) ...sogar mit lustigen Kommentaren versehen :D

Was ich gerade jetzt erste merke ist, dass der CKEditor die BRs innerhalb der Ps setzt. Deshalb scheinen deine RegExe noch nicht die richtige Wirkung zu entfalten.

Momentan ergbit diese Originalsausgabe aus dem Editor:

Code: Alles auswählen

<p>foo</p>

<p>bar</p>

<p></p>

<p><br />
<br />
batz</p>

<p>foo</p>

<p><br />
<br />
<br />
<br />
&nbsp;</p>

<p></p>

<p></p>

<p>bar</p>

<p></p>

<p>batz</p>

<p>foo</p>

<p><br />
bar<br />
batz</p>

<p></p>

<p></p>
das hier mit deinen RegExen:

Code: Alles auswählen

<p>foo</p>
<p>bar</p>
<p>
<p>foo</p>
<p>
<p>bar</p>
<p>batz</p>
<p>foo</p>
<p>
<p>foo</p>
<p>bar</p>
<p>
<p>foo</p>
<p>
<p>bar</p>
<p>batz</p>
<p>foo</p>
<p>
<p>
Das 1. batz wurde z.B. verschluckt oder auch das letzte bar und batz. Und es sind jetzt ungeschlossene Ps da :) Hast noch mal ein Update? :D

Re: RegEx Hilfe benötigt

Verfasst: 20. Sep 2013, 11:29
von Xong
Hi Rudi,

dein Problem kann ich nicht nachvollziehen.

Mit dieser leicht modifizierten Variante, in der ich noch die leeren <br>s wegschneide

Code: Alles auswählen

// match all tags except lonely <br />s outside of any elements ;-(
data = data.match(/(<(?!br)(\w)[^>]*>(.*?<\/\2>)?)/igm).join("\n");
// replace empty paragraphs
data = data.replace(/(<p>(\s|&nbsp;|<br\s*\/ )*<\/p>)/igm, '');
bekomme ich folgendes Ergebnis:

Code: Alles auswählen

<p>foo</p>
<p>bar</p>

<p><br />    <br />    batz</p>
<p>foo</p>



<p>bar</p>

<p>batz</p>
<p>foo</p>
<p><br />    bar<br />    batz</p>
Siehe auch http://jsfiddle.net/tDdRc/.

Re: RegEx Hilfe benötigt

Verfasst: 20. Sep 2013, 11:38
von RexDude
Aber hast du hier nicht noch 2 BRs in deinem Ergebnis hintereinander?

Code: Alles auswählen

<p><br />    <br />    batz</p>

Re: RegEx Hilfe benötigt

Verfasst: 20. Sep 2013, 11:59
von Xong
RexDude hat geschrieben:Aber hast du hier nicht noch 2 BRs in deinem Ergebnis hintereinander?

Code: Alles auswählen

<p><br />    <br />    batz</p>
Ja klar. Die können ja auch beabsichtigt sein, oder nicht?
Man könnte natürlich aufeinanderfolgende <br>s noch durch ein einziges ersetzen.

Re: RegEx Hilfe benötigt

Verfasst: 20. Sep 2013, 12:10
von RexDude
Ja klar. Die können ja auch beabsichtigt sein, oder nicht?
Genau das möchte ich ja vermeiden. Hatte erst kürzlich einen Redakteur, der sich hier ganz lustige Abstände zusammengebaut hat. Dabei hab ich doch ein Abstandsmodul für diesen Fall vorgesehen ;)

Mit Textile ist sowas ja auch nicht möglich für den normal User.

Re: RegEx Hilfe benötigt

Verfasst: 20. Sep 2013, 12:25
von RexDude
Also prinzipiell kann man folgendes sagen: alle Paragraphen die keinen normalen Text enthalten, sonder leer sind, &nbsp; enthalten oder min. 1 BR enthalten sollen herausgefiltert werden. Dafür müsste eigentlich ein RexEx ausreichen, oder?

Re: RegEx Hilfe benötigt

Verfasst: 20. Sep 2013, 12:50
von Xong
RexDude hat geschrieben:Also prinzipiell kann man folgendes sagen: alle Paragraphen die keinen normalen Text enthalten, sonder leer sind, &nbsp; enthalten oder min. 1 BR enthalten sollen herausgefiltert werden. Dafür müsste eigentlich ein RexEx ausreichen, oder?
Wie gesagt, ich würde Massen-<br>s mit einzelnen austauschen. Schließlich kommt es ziemlich oft vor, dass man einzelne Zeilenumbrüche braucht (Gedichte, zweizeilige Überschriften, Fließtexte, etc.).

Ich denke das hier, wird dir gefallen:

Code: Alles auswählen

// match all tags except lonely <br />s outside of any elements ;-(
data = data.match(/(<(?!br)(\w)[^>]*>(.*?<\/\2>)?)/igm).join("\n");
// replace leading <br>s
data = data.replace(/(<(?!br)(\w)[^>]*>)(\s*<br\s*\/?>\s*)+/igm, '$1');
// replace trailing <br>s
data = data.replace(/(\s*<br\s*\/?>\s*)+(<\/(?!br)(\w)>)/igm, '$2');
// replace empty paragraphs
data = data.replace(/(<p>(\s|&nbsp;|<br\s*\/?>)*<\/p>)/igm, '');
// replace multiple <br>s with a single one
data = data.replace(/(<br\s*\/?>\s*)+/igm, '<br />');
http://jsfiddle.net/tDdRc/5/

Edit: Hab grad gemerkt, dass das Forum meinen Code verändert hat. Deshalb haben meine ersten Regexe, nicht das gewünschte Ergebnis gebracht. Hol dir den Code am besten von jsFiddle.

Re: RegEx Hilfe benötigt

Verfasst: 20. Sep 2013, 15:04
von RexDude
Oh ja Baby, das gefällt mir :D Ich schau später mal wie ich das in das CKEditor-Modul packe.

Danke Robert! ...der nächste Burger geht definitiv auf mich :lol:

Re: RegEx Hilfe benötigt

Verfasst: 21. Sep 2013, 23:06
von RexDude
Hast du hierzu auch noch ne Idee, Robert?
https://github.com/RexDude/email_obfuscator/issues/7