Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]10474[/thread]

Monster-Regex: negativer look behind

Leser: 1


<< >> 8 Einträge, 1 Seite
Froschpopo
 2007-09-26 21:56
#100027 #100027
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
also folgendes:

Code: (dl )
$string = "Dies ist ein [HAUS]\n\n\nUnd ich wohne darin";

nun brauche ich einen Regex, der alle \n durch <br> ersetzt, AUßER: der \n steht direkt hinter ]
Außerdem sollen mehrere aufeinanderfolgende \n durch ein einzelnes <br> ersetzt werden.

Also quasi sowas:
Code: (dl )
$string =~ s/(!\])\n{2,}/<br>/gs;

Leider funkt das ding vorn und hinten nicht.
topeg
 2007-09-26 22:19
#100031 #100031
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Die Schreibweise war nicht ganz richtig:
Code (perl): (dl )
$string =~ s/(?!\])\n+/<br>/gs;
Froschpopo
 2007-09-26 22:26
#100032 #100032
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Aber das stimmt ja nicht,
Code: (dl )
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl

use strict;

my $body = "Dies ist mein [HAUS]\n\n\nUnd ich wohne darin";

$body =~ s/(?!\])\n+/<br>/gs;

print $body;


Ergebnis:
Code: (dl )
Dies ist mein [HAUS]<br>Und ich wohne darin

Es ist wider Willens ein <br> direkt hinter ]
Der Zeilenumbruch soll überall durch <br> ersetzt werden, außer hinter ]
Ansonsten soll für alle \n gelten: Niemals zwei hintereinander.
topeg
 2007-09-26 22:39
#100035 #100035
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Erst lesen dann schreiben. Habe Lookahead und Lookbehind vertauscht. :-/
Code (perl): (dl )
$body =~ s/(?<!\])\n+/<br>/gs;
Froschpopo
 2007-09-26 22:47
#100036 #100036
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Jetzt macht er aber folgendes:
Code: (dl )
1
2
Dies ist mein [HAUS]
<br>Und ich wohne <br>darin

Jetzt ersetzter den \n direkt hinter ] zwar nicht, aber dafür die darauf folgenden.

Aber ich glaube es liegt an mir; ich habe es nicht gut formuliert: Auf ] darf kein Zeilenumbruch folgen, auch nicht als übernächstes Zeichen.

Zur Erklärung:
[HAUS] wird später im HTML-Quelltext durch ein Bild (<img src...) ersetzt, woraufhin kein Zeilenumbruch erfolgen darf.
Um Ordnung im Quelltext zu gewährleisten will ich mir aber dort \n's erlauben.
topeg
 2007-09-26 23:05
#100040 #100040
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
allso so:
Code (perl): (dl )
$body =~ s/(\]?)(\n+)/$1?$1.$2:"<br>"/ges;


Machst es einem auch nicht leicht. ;-)
Hagen
 2007-09-28 13:28
#100105 #100105
User since
2007-09-06
233 Artikel
BenutzerIn
[default_avatar]
Hallo topeg,

also den ersten Teil der regex habe ich noch verstand. Könntest du mir bitte mal den zweiten Teil erklären (/$1?$1.$2:"<br>"/). Ist das eine if-Bedingung?
Gruß
Hagen
nepos
 2007-09-28 15:09
#100121 #100121
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Der ternäre Operator ? :. Falls in $1 was steht, wird "$1.$2" eingesetzt, ansonsten einfach "<br>". Dabei ist das e als Abschluss wichtig, da nur dadurch die rechte Seite der Ersetzung als Ausdruck evaluiert wird.
<< >> 8 Einträge, 1 Seite



View all threads created 2007-09-26 21:56.