Thread irssi: mehrere RegEx in einer Zeile traversieren (4 answers)
Opened by Cthulhux at 2013-08-04 17:46

Cthulhux
 2013-08-04 19:16
#169351 #169351
User since
2013-08-04
3 Artikel
BenutzerIn
[default_avatar]
2013-08-04T16:58:10 Raubtier
In beiden Regexps benutzt du den *, dieser matcht also so viele Zeichen wie möglich und sucht dann also praktisch von hinten die passenden ]] oder }}. Du möchtest die aber von vorne suchen, also die ersten ]] hinter den [[, d.h. du musst hier statt des * ein *? verwenden.


Du hast Recht, danke.

2013-08-04T16:58:10 Raubtier
Und als zweites kannst du das if durch while ersetzen.


Getan - klappt nur so halbgut:

Quote


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use strict;
use Encode qw(encode decode);
use Irssi qw(signal_add);

sub linkify {
    my ($text) = @_;

    $text =~ s/ /_/gm;
    $text =~ s/\[\[|\]\]|\{\{|\}\}//gm;
    return $text;
}

sub wikilink {
    my ($server, $message, $nick, $address, $target) = @_;

    $_ = decode('utf-8',$message);  # recognize umlauts

    while (/\[\[(\w|\s|!|#|\/|\.|-|\(|\)|\\|{|}|_|^,|`|\/|;|'|\:|\[|\])*?\]\]/i) {
        # is linky there?
        return if $server->channel_find($target)->nick_find_mask("*linky");

        my $wplink = linkify($&);
        my $retval = "http://de.wikipedia.org/wiki/" . encode('latin1',$wplink);
        $server->command("MSG $target $retval");
    }
    while (/\{\{(\w|\s|!|#|\/|\.|-|\(|\)|\\|{|}|_|^,|\`|\/|;|'|\:|\[|\])*?\}\}/i) {
        # is linky there?
        return if $server->channel_find($target)->nick_find_mask("*linky");

        my $wplink = linkify($&);
        my $retval = "http://de.wikipedia.org/wiki/Vorlage:" . encode('latin1',$wplink);
        $server->command("MSG $target $retval");
    }

    return 0;
}

signal_add("message public","wikilink");


2013-08-04T16:58:10 Raubtier
Die Ausdrücke sehen unnötig kompliziert aus. Wenn du mehrere Zeichen erlauben willst, kannst du statt a|b|c|d einfach [abcd] schreiben (und wenn die Zeichen zusammenhängen, geht auch [a-d].


Ich müsste demnächst mal evaluieren, welche Zeichen in Artikelnamen überhaupt möglich sind...

2013-08-04T16:58:10 Raubtier
dein linkify machst ja eigentlich auch nicht einen Link, wie der Name vermuten lassen würde, sondern entfernt ja diese nur.


Die Funktion hatte erst den Namen und dann den Code. Stimmt, der Name ist unlogisch...

2013-08-04T16:58:10 Raubtier
Und ich finde es angenehmer, das gefundene mit () einzufangen und dann $1 zu nehmen statt $&


Optimierungen mach' ich, wenn alles läuft. ;-)

View full thread irssi: mehrere RegEx in einer Zeile traversieren