Schrift
[thread]7723[/thread]

regex escape



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
jmb
 2006-02-21 17:01
#63124 #63124
User since
2006-02-08
30 Artikel
BenutzerIn
[default_avatar]
Servus,

ich suche ein Modul oder eine Funktion, das mir die Regex Sonderzeichen, von denen es ja ein paar gibt, escaped.

Im Idealfall übergebe ich der Funktion einen String, der unter Umständen, Regex Sonderzeichen beinhaltet. Als Rückgabe-Wert erhalte ich dann einen String, der die aufkommenden Sonderzeichen escaped hat.

bzp:

Code: (dl )
1
2
my $string = "hallo\w";
my $new_string = tolle_funktion($string);

jetzt sollte $new_string folgenden inhalt haben:
hallo\\w

Wäre nett, wenn jmd. Infos hat. Ansonsten ist das wieder einer der Tasks, die Ewigkeiten zum Coden dauern :-(

Cheers
Jmb
esskar
 2006-02-21 17:04
#63125 #63125
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
\Q \E
jmb
 2006-02-21 17:13
#63126 #63126
User since
2006-02-08
30 Artikel
BenutzerIn
[default_avatar]
tres bien - sogar noch besser, spar ich mir ja eine funktion, da ich es direkt innerhabl der regex verwenden kann - danke
Crian
 2006-02-21 17:16
#63127 #63127
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Innerhalb von "..." könte aber schon etwas interpretiert worden sein. Nimm lieber '...'.
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
pq
 2006-02-21 23:03
#63128 #63128
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
das funktions-äquivalent zu \Q\E heißt übrigens quotemeta.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
jmb
 2006-02-22 09:12
#63129 #63129
User since
2006-02-08
30 Artikel
BenutzerIn
[default_avatar]
hi, danke für Ihre Antworten

werde mal sehen, ob der funktionsaufruf, die regex selbst oder single quotes fuer mich am besten passen. habe das problem, dass ich einen string habe, der ungefaehr so aussieht:

test|test2|test3

die pipes müssen im string bleiben und dürfen nicht escaped werden, da ich sie in der regex für die alternierung brauche, wenn jetzt zwischen den pipes regex steht, werd ich es jetzt wohl mal so versuchen:

Code: (dl )
my $sth =~ m/('test'|'test3*'|'test3')/;


Sollte das einfachste sein, da ich dann den string selbst mit einem substitute manipulieren kann und ihn dann so in die regex werfe.

also danke nochmal für die denkanstoesse.
jmb

p.s. hoffentlch hab ich so frueh am morgen noch keinen denkbug ;)
Crian
 2006-02-22 11:34
#63130 #63130
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Hmmm und die Teile zwischen den Pipes sollen Escaped werden? Falls diese keine weiteren Pipes enthalten, beitet es sich an, deinen String an den Pipes zu splitten und dann einen entsprechenden regulären Ausdruck zusammenzubauen.

Etwa so

Code: (dl )
1
2
3
my $string = '.+_*|\d|\w\w\w';
my $re_text = join '|', map {"\Q$_\E"} split /\|/, $string;
... =~ /$re_text/;


Der $re_text enthält dann \.\+_\*|\\d|\\w\\w\\w.\n\n

<!--EDIT|Crian|1140601140-->
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
root
 2006-02-24 01:11
#63131 #63131
User since
2003-08-15
120 Artikel
BenutzerIn
[default_avatar]
Ich kapiers nicht! Ist ja auch schon bissi spät...

Ich habe diesen Text
Quote
...
<!-- start oe2edit fileinfo -->
<!--
This is a oe2edit contentfile
It should have no <html> <head> <body> tag, because it will be placed in another html file

The following variables discribe how long this content will be active
start_date=23.02.2006 23:30
end_date=01.01.1970 01:00
start_timestamp=1140733800
end_timestamp=0

The following variables show the status of authentification from oe2edit autherware
auth_query are all users for authentification, auth_permit permission allredy arrived from these users
auth_query=
auth_permit=

Last modification by oe2edit of this contentfile
last_update_date=23.02.2006 23:31
last_update_username=admin
-->
<!-- end oe2edit fileinfo -->
...


und den möchte ich gerne einfach nur weg haben, in meinem Bsp jetzt soll er durch "PASST" ersetzt weder, dann sehe ich schneller dass es nicht klappt...

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
    # oe file info aus code löschen
my $start_regex = "\Q<!-- start oe2edit fileinfo -->\E";
my $end_regex = "\Q<!-- end oe2edit fileinfo -->\E";

###### LÖSCHEN #####
open( FILE, ">test.txt" );
print FILE 's/'.$start_regex.'.+'.$end_regex.'/PASST/i';
close (FILE);
##### NUR TEST #####


$htmlcode =~ s/$start_regex.+$end_regex/PASST/i;# if($$USER_ref{'type'} ne "admin");


Dateiinhalt von test.txt:
Quote
s/\<\!\-\-\ start\ oe2edit\ fileinfo\ \-\-\>.+\<\!\-\-\ end\ oe2edit\ fileinfo\ \-\-\>/PASST/i


Er findets nicht! Warum??? Hilfe!
Er tut einfach gar nichts!
renee
 2006-02-24 02:07
#63132 #63132
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
    # oe file info aus code löschen
my $start_regex = '<!-- start oe2edit fileinfo -->';
my $end_regex = '<!-- end oe2edit fileinfo -->';

$htmlcode =~ s/\Q$start_regex\E.+?\Q$end_regex\E/PASST/si;# if($$USER_ref{'type'} ne "admin");

open( FILE, ">test.txt" );
print FILE $htmlcode;
close (FILE);


Du solltest noch das s-Flag setzen...
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/
root
 2006-02-24 10:08
#63133 #63133
User since
2003-08-15
120 Artikel
BenutzerIn
[default_avatar]
fett!
Diese 30 Sekundenaktion hat mich gestern bestimmt 1h gekostet...

Was macht das s???

Danke!!!!
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2006-02-21 17:01.