Schrift
[thread]5989[/thread]

RegEx: mal wieder...



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
pktm
 2004-12-29 21:31
#77398 #77398
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!
Ich muss einen Datensatz aus einer Textarea auf seine richtige ZUsammenstellung überprüfen.
Es egtj dabei um die Seiten-Einträge für mein CMS in einem  Flatfile.
Die einzelnen Datensätze haben die Form:
nr \t keyword \t titel \t meta-keywords \t meta-desc \t meta-page-topic \t datei(Pfad)
Dachte ich kann das so überprüfen, aber es klappt nicht, muss mal noch suchen :)
Code: (dl )
1
2
3
4
    foreach my $zeile ( split/\n/, $rec_db ) {
       $zeile =~ s/\|/\t/g;
       if( $zeile !~ /\d*\t\w*\t[\w* ]\t[\w* ]\t[\w* ]\t[\w* ]\t[\w* ]\..{1,4}\n/ ){ $error = 1; }
   }

Zuerst splitte ich die einzelnen Datensätze, die ja immer in einer Zeile stehen auf und dann überprüfe ich.
(Die | sind im HTML-Formular als Trennzeichen angegeben, weil sich Tabstops in einem Formular nur sehr schlecht als Trennzeichen eignen...)
Kann das sein, dass bei dem Split schon was daneben geht?
So dass der Zeilenumbruch dem folgenden Datensatz zugeordnet wird oder so?
mfg pktm
EDIT: schon fast peinliche Typos\n\n

<!--EDIT|pktm|1072726679-->
http://www.intergastro-service.de (mein erstes CMS :) )
renee
 2004-12-29 22:01
#77399 #77399
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn Du split() verwendest, verschwindet das Trennzeichen.
Probier Deine RegEx mal ohne das \n dafür ein $
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/
pktm
 2004-12-29 22:43
#77400 #77400
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Aha.
Habe mal \n durch $ ersetzt, jecoh ohne Erfolg.
Am Zeilenumbruch der Textarea kann es auch nicht liegen.
1. habe ich den auf "hard" gestellt, also so dass nur vom Benutzer wirklich umgebrochen werden kann und
2. habe ich die Textarea so riesig gemacht, dass der Datensatz auf jeden Fall reinpasst (sieht zwar scheiße aus, sollte aber eine gewisse Sicherheit bringen).
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
steffenw
 2004-12-29 23:10
#77401 #77401
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Du kannst doch erst nach \n splitten danach wieder nach \t. scalar @values sagt Dir dann wie viele Felder mit mit \t getrennt waren.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
foreach my $zeile ( split/\n/, $rec_db ) {
 my @values = split /\t/, $zeile;
 # und dann hast Du die Werte alle im Array
 # um sie über Ihren Namen anzusprechen gäng's auch so
 my @keys = qw/nr keyword titel meta-keywords meta-desc meta-page-topic datei(Pfad)/;
 my %hash = map {length $values[$_] ? ($key[$_] => $values[$_]) : ()} 0..$#values if scalar @values;
 # nun kannst Du z.B. mit exists $hash{nr} nachschauen,
 # ob die gewünschten Werte existierten,
 # denn die Schlüssel werden nicht angelegt,
 # wenn zwei \t aufeinander folgten
 # oder wenn nicht alle Felder angegeben wurden.
 # ansonsten gänge auch @hash{@keys} = @values;
}


In Deinem regulären Ausdruck [\w* ] ist * kein Wiederholungsfaktor, sondern es ist durch die [] eine Zeichenklasse mit dem Inhalt \w, * und Leerzeichen, es hätte vielleicht [\w ]* heißen sollen.

Mit der Zeile
$zeile =~ s/\|/\t/g;
machst Du | gleichwertig zu \t.

Dann kannst Du aber auch gleich
my @values = split /[\t|]/, $zeile;
oder
my @values = split /\t|\|/, $zeile;
schreiben.
Willst Du auch noch Leerzeichen links und rechts eben dem Seperator \t oder | zulassen, geht dann auch:
my @values = split / *[\t|] */, $zeile;\n\n

<!--EDIT|steffenw|1072786878-->
$SIG{USER} = sub {love 'Perl' or die};
pktm
 2004-12-29 23:21
#77402 #77402
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
> foreach my $zeile ( split/ /, $rec_db ) {
Das geht nicht.
Die verschiedenen Datensätze sind durch \n voneinander getrennt.
Wenn ich nach Leerzeichen splitten würde bekäme ich irgendwelche willkürlichen Schnipsel raus, da Leerzeichen fast in allen Abschnitten eines Datensatzes vorkommen können, nur nicht da, wo Trennzeichen stehen.

Die Datensätze wurden aus einer Datei Zeilenweise ausgelesen, in ein Textarea-Feld geschrieben damit man sie verändern kann und über dieses wieder verschickt.
Folglich ist in $query->{db} ( use Vars; my $cghi = CGI->new(); my $query = $cgi->vars(); ) ein String, der diue ganzen Zeilen, incl. \n der Textarea enthält.

Aber das mit dem Hash wäre vielleicht einen Versuch wert.
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
steffenw
 2004-12-29 23:28
#77403 #77403
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
[Ausdruck gelöscht] Forum!!!,
man kann hier nicht mal
 Backslash n
im Perlcode schreiben, das wird einfach nicht dargestellt, sondern umgewandelt. Ich habe nämlich nicht
 Slash, Leerzeichen und Slash
geschrieben, sondern
 Slash, Backslash, n und Slash.
Ich hoffe, das bringt mal einer in Ordnung, Fluch, Fluch, Fluch, ... .\n\n

<!--EDIT|steffenw|1072786990-->
$SIG{USER} = sub {love 'Perl' or die};
[E|B]
 2004-12-29 23:45
#77404 #77404
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@steffenw

Danke für die Meldung. Jedoch kann man sich auch ohne Fekalausdrücke aufregen, IMHO!
Ich leite es an das Boardteam weiter. Kann sein, dass es nicht korrigiert wird, weil die ganze Community eh bald auf das selbstgeschriebene Forum umgestellt wird.
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
esskar
 2004-12-29 23:50
#77405 #77405
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
geändert!!!
Relais
 2004-01-03 00:45
#77406 #77406
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=esskar,29.12.2003, 22:50]geändert!!![/quote]
im Perl-Tag?

PS: "Drei Ausrufezeichen", fuhr er fort und schüttelte den Kopf. "Sicheres Zeichen für einen kranken Geist." (Terry Pratchett in "Eric")
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
steffenw
 2004-01-03 16:22
#77407 #77407
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Relais,02.01.2004, 23:45][quote=esskar,29.12.2003, 22:50]geändert!!![/quote]
im Perl-Tag?[/quote]
Nee, nee, er hat meinen Perl-Tag in einen Code-Tag geändert, weil dort die Interpretierung von \n in das binäre Zeichen dafür nicht erfolgt. Ich fand das Perl-Tag zwar optisch ansprechender, aber was soll's, ich finde mich damit ab und bin guter Hoffnung, daß das neue Forum besser wird.\n\n

<!--EDIT|steffenw|1073139823-->
$SIG{USER} = sub {love 'Perl' or die};
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2004-12-29 21:31.