Schrift
[thread]7900[/thread]

Zeichen in RegEx darf nicht zwischen <> stehen

Leser: 2


<< |< 1 2 3 >| >> 27 Einträge, 3 Seiten
Matze
 2006-04-18 11:40
#65010 #65010
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ist es möglich in einer Regular Expression zu definieren, dass z.B. eine Zahl nicht zwischen spitzen Klammern(<>) stehen darf ?
Denn nur, wenn sie nicht zwischen den Klammern steht, soll sie ersetzt werden mit einem HTML-Tag(<font color="#ff0000"></font>)

Ich wollte jede Zahl in einer Textdatei rot färben, aber wenn es jetzt eine Datei ist die schon HTML-Tags enthält, habe ich ein problem.
Dann werden auch Zahlen wie sie z.B. im color="" Attribut oft verwendet werden rot gefärbt.

Zum Verständnis, mein Versuch:
Code (perl): (dl )
$data =~ s/(\d+)/<font color=\"#ff0000\">$1<\/font>/gi


MfG. Matze
Mit freundlichen Grüßen: Matze
Crian
 2006-04-18 12:22
#65011 #65011
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Probier mal, ob (\d+)[^>]*(?:<|$) als Suchstring deinen Wunsch erfüllt.\n\n

<!--EDIT|Crian|1145348591-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Matze
 2006-04-18 13:43
#65012 #65012
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Es ist schon sehr nah dran, allerdings verstehe ih nicht genau was dies: [^>]*(?:<|$) bewirkt.
Und bei folgender RegEx:
Code: (dl )
$data =~ s/(\d+)([^>]*(?:<|$))/<font color=\"#ff0000\">$1<\/font>$2/


Und folgender Testdatei:
Code: (dl )
1
2
3
4
5
6
7
<font color="#000000"><pre>
<br>"Hallo"
<br>1234<br>214214<br>346<br>
<br>
<br>();
<br>("Test! 2134",12421<br>
);</pre></font>


Dann wird bei mir leider die letzte Zahl(12421) nicht rot gefärbt.

MfG. Matze

//modedit GwenDragon Similes abgeschaltet wegen Interferenz mit ) in Code\n\n

<!--EDIT|GwenDragon|1145355751-->
Mit freundlichen Grüßen: Matze
nepos
 2006-04-18 14:20
#65013 #65013
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Nur mal am Rande, die Font-Tags sollte man eigentlich nicht mehr nutzen. Besser waeren Spans mit CSS.
Matze
 2006-04-18 14:35
#65014 #65014
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=nepos,18.04.2006, 12:20]Nur mal am Rande, die Font-Tags sollte man eigentlich nicht mehr nutzen. Besser waeren Spans mit CSS.[/quote]Ich möchte ja nur mal probieren wie so was funktioniert.

Komme allerdings dabei im Moment auch nicht weiter...
Ich verstehe einfach nicht warum die letzten Zahlen nicht gefärbt werden.

MfG. Matze
Mit freundlichen Grüßen: Matze
renee
 2006-04-18 15:14
#65015 #65015
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mach's mit CPAN:HTML::Parser:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl

use strict;
use warnings;
use HTML::Parser;

# specify events here rather than in a subclass
my $p = HTML::Parser->new( api_version => 3,
text_h => [\&text,"text"],
default_h => [sub { print shift }, "text"],

);
sub text{
my ($text) = @_;
$text =~ s~(\d+)~<test>$1</test>~g;
print $text;
}

while (<>) {
$p->parse($_);
}
$p->eof;
\n\n

<!--EDIT|renee|1145358904-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2006-04-18 15:22
#65016 #65016
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Erklärung:

(\d+) - 1-beliebig viele Ziffern, gefangen in $1
[^>]* - 0-beliebig viele Zeichen, die keine schließende spitze Klammer sind
(?:<|$) - entweder das Zeichen '<' oder das Ende des Strings in einer nicht fangenden Klammer\n\n

<!--EDIT|Crian|1145359386-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
sid burn
 2006-04-18 17:45
#65017 #65017
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Ich hab dafür ein etwas längeres Skript geschrieben. Vielleicht geht das auch mit einem Regulären Ausdruck, aber diese Lösung ist mir eigentlich sofort eingefallen, deswegen habe ich diese eben geschrieben.

zahlrot.txt
Code: (dl )
1
2
3
4
5
6
7
<font color="#000000"><pre>
<br>"Hallo"
<br>1234<br>214214<br>346<br>
<br>
<br>();
<br>("Test! 2134",12421<br>
);</pre></font>


zahlrot.pl
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl -w

$file = shift;

$/ = undef;
open FILE, "<", $file;
$_ = <FILE>;
close FILE;

while ( not m/\G\z/gc )
{
if ( m/\G(<(?>[^>"]|"[^"]*")*>)/gc ) { print "$1"; }
elsif ( m/\G(\d+)/gc ) { print "<font color=red>$1</font>"; }
elsif ( m/\G([^<\d]*)/gc ) { print "$1"; }
else
{
$loc = pos($file);
die "Fehler an Position $loc in Datei $file\n";
}
}


Aufruf mittels:
Code: (dl )
./zahlrot.pl zahlrot.txt


Ausgabe:
Code: (dl )
1
2
3
4
5
6
7
<font color="#000000"><pre>
<br>"Hallo"
<br><font color=red>1234</font><br><font color=red>214214</font><br><font color=red>346</font><br>
<br>
<br>();
<br>("Test! <font color=red>2134</font>",<font color=red>12421</font><br>
);</pre></font>


Ich hoffe das entspricht deinen Erwartungen?


EDIT:
Größer Gleich Zeichen innerhalb von Anführungszeichen werden nun ignoriert.\n\n

<!--EDIT|sid burn|1145374362-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Matze
 2006-04-18 18:20
#65018 #65018
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Génauso hatte ich mir das vorgestellt, danke!
HTML::Parser werde ich mir allerdings auch noch mal ansehen, ist sicher interessant.

@Crian: Danke für die Erklärung.
Ich muss mir Regular Expressions wohl nochmal eindringlich ansehen.

MfG. Matze
Mit freundlichen Grüßen: Matze
Dubu
 2006-04-18 18:25
#65019 #65019
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Es klingt zwar erstmal bestechend, alle paarweise stehenden spitzen Klammern zu suchen. Das geht aber schief, wenn du spitze Klammern dazwischen hast, die nicht zur HTML-Syntax gehören, z.B. in JavaScript (if (x > y) {...) oder alt-Attributen (<img src="/img/next.gif" alt=">>">).
HTML::Parser macht's besser.
<< |< 1 2 3 >| >> 27 Einträge, 3 Seiten



View all threads created 2006-04-18 11:40.