Thread mein script verweigert ignore_case in utf-8 pattern matching (23 answers)
Opened by technix at 2013-06-02 16:19

pq
 2013-06-03 23:56
#167935 #167935
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ok, an dieser stelle darf ich dir ein tutorial wie Modern Perl empfehlen. das oder andere findest du auf http://perl-tutorial.org/

strict und warnings sollten drin sein (-w ist veraltet), lexikalische filehandles, wie schon erwähnt, und CGI.pm solltest du auch verwenden. das einlesen der parameter von hand macht man schon lange nicht mehr.
wenn du utf8 direkt im skript hast, dann musst du use utf8 auch drinhaben.
längere strings sollte man mit here-doc ausgeben (siehe zeile 17).

ich war so frei, das gesamte script mal umzuschreiben.
das funktioniert bei mir mit parameter "bez=HÄUSER" und in der bb.txt steht "häuser".
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
39
40
41
42
43
44
#!/usr/bin/perl
use strict;
use warnings;
use utf8; # script beinhaltet direkt utf8

use CGI::Carp qw( fatalsToBrowser );
use CGI;
use Encode qw(encode decode);
my $enc = 'utf-8';
my $cgi = CGI->new;

my $infile = "bb.txt";
my $bez = decode($enc, $cgi->param('bez')) || "Red";
# zur Ausgabe wieder kodieren
binmode STDOUT, ':encoding(UTF-8)';

print <<"EOM";
Content-type: text/html; charset=utf-8

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<form method="GET" action="bb.pl" name="ArtSuch" accept-charset="UTF-8">
  <input type="hidden" name="dummyChar" value="♥" /> <!--wegen IE utf-8 problem-->
  Bitte nach deutschen Umlauten (groß/kleingeschrieben) suchen<br>
 Suchtext <input name="bez" size="10" value="" maxlength="3" type="text"></form>
EOM

print "gesucht wird: $bez<br><br>Ergebnis:<br>";

-T $infile or die "$infile not an ASCII file";
open my $fh, "<:encoding(UTF-8)", $infile or die "keine Textdatei: $!";

while (my $testline = <$fh>) {
    if ($testline  =~ m/$bez/i) {
        print "$testline <-- ich hab ein &quot;$bez&quot; gefunden!<br>";
    } 
    else {
        print "$testline<br>";
    }
}

print qq*<br>Eine Suche nach F findet alle 3 F (groß und klein)<br>
leider ist das bei den Umlauten nicht so"*;

exit(0);


edit: und noch ein kommentar zur regex: wenn keine regex-sonderzeichen benötigt werden, empfiehlt es sich, das so zu schreiben: m/\Q$bez\E/i
damit deaktivierst du eventuell eingegebene regex-sonderzeichen, die unter umständen auch dazu führen können, dass ein matching sehr lange dauert. wenn also jeder da was ins formular eintragen kann, lieber auf nummer sicher gehen.
Last edited: 2013-06-04 00:32:17 +0200 (CEST)
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

View full thread mein script verweigert ignore_case in utf-8 pattern matching