QuoteLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
2014-06-10T17:36:33 hlubenowKommt wohl auch darauf an, was "in der Nähe" bedeutet. Wenn's in derselben Zeile ist, wär's z.B. einfach.
1 2 3 4 5
my ($naehe) = $text =~ /(.{,100}sit amet.{,100})/ or die; my @suchphrasen = ("sed diam"); for (@suchphrasen) { warn "ja!" if $naehe =~ /\Q$_/; }
2014-06-10T18:56:10 RaubtierDaher hatte ich überlegt, mit split an Whitespace zunächst Worte zu bilden und dann - tja, und dann? Die Suchphrasen haben 1 bis 3 oder 4 Wörter, selten auch mal mehr.
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 45 46
#!/usr/bin/perl use strict; use warnings; # Mögliche Kollokationen (statische Vorgabe) my %colls = ( 0 => 'vor' , 1 => 'nach' , 2 => 'vor oder nach' ); # Das Korpus my $txt = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.'; # Der Suchstring (Benutzereingabe) my $such = "sed diam"; # Die Textumgebungen (Benutzereingabe) mit Abständen (Anzahl Wörter im Zwischenraum) und Kollokationen (s.o. %colls) my %kontexts = ( "sit amet" => {'dist' => 3, 'coll' => 1} , "eirmod" => {'dist' => 2, 'coll' => 2} , "Lorem" => {'dist' => 8, 'coll' => 0} ); for my $ktxt (keys %kontexts) { my $dist = $kontexts{$ktxt}->{dist}; my $coll = $kontexts{$ktxt}->{coll}; my ($s1, $s2) = ($such, $ktxt); print "Suche '$such' bis zu $dist Textsegmente $colls{$coll} '$ktxt'\n"; my $hit; for (1..($coll ? $coll : 1)) { ($s1, $s2) = ($s2, $s1) if $coll; $hit = $1 if $txt =~ /(\b$s1\W*(?:\w+\W+){0,$dist}$s2\b)/i; last if $hit; } if ($hit) { print " Treffer: '$hit'\n"; } else { print " Kein Treffer\n"; } }