를 사용하여 Perl,어떻게 보면 주위의 상황에 검색어를 검색 결과?
-
03-07-2019 - |
문제
내가 쓰는 Perl 스크립트를 검색 용어에 큰 부분의 텍스트입니다.고 싶은 전시 사용자에게 다시 작은 하위 집합의 주위에 텍스트 검색어를,그래서 그 사용자가 가질 수 있는 곳의 상황이 검색어가 사용됩니다.Google 검색결과의 좋은 예를 들어 내가 무슨 노력을 달성하는 컨텍스트의 검색어가 표시되는 제목으로의 링크입니다.
내가 기본 검색을 사용:
if ($text =~ /$search/i ) {
print "${title}:${text}\n";
}
($제목이 포함 항목의 제목 검색어에서 발견되었) 이것은 너무 많이지만,때로는 이후$텍스트의 수백을 들고 있습니다.
이 웹에 표시할 수 있도록 제공으로 제목에 대한 링크는 실제 텍스트,그러나 없 컨텍스트를 이용자에게 있습니다.
I tried 수정 나의 정규 표현식을 캡처하는 4 단어가기 전에 4 말하기,문제에 부딪쳤는 경우 검색어가 시작 또는 끝까지 달러의 텍스트입니다.
무엇을 할 수있는 좋은 방법이 될 것입 to accomplish this?나를 찾 CPAN 내가 확신하기 때문에 누군가가는 모듈이 있습니다 이를 위해,그러나 나는 생각하지 않을 수 있습니는 단어를 검색한다.나 아 하지 않고 이 모듈은 가능한 경우에는 받고 있기 때문에 모듈을 설치되어 여기에는 것은 고통이다.사람이 어떤 아이디어가 있습니까?
해결책
전/후 4 단어의 초기 시도는 그리 멀지 않았습니다.
노력하다:
if ($text =~ /((\S+\s+){0,4})($search)((\s+\S+){0,4})/i) {
my ($pre, $match, $post) = ($1, $3, $4);
...
}
다른 팁
$ $를 사용할 수 있습니다and $' to get the string before and after the match. Then truncate those values appropriately. But as blixtor points out, shlomif is correct to suggest using
@+and
@-to avoid the performance penalty imposed by $
그리고 #' -
$foo =~ /(match)/;
my $match = $1;
#my $before = $`;
#my $after = $';
my $before = substr($foo, 0, $-[0]);
my $after = substr($foo, $+[0]);
$after =~ s/((?:(?:\w+)(?:\W+)){4}).*/$1/;
$before = reverse $before; # reverse the string to limit backtracking.
$before =~ s/((?:(?:\W+)(?:\w+)){4}).*/$1/;
$before = reverse $before;
print "$before -> $match <- $after\n";
내가 사용하는 것이 좋습니다 매개변수-@+고@-(볼 수 있 perlvar)을 찾기 위치에서 문자열의 경기,그리고 얼마나 걸립니다.
다음을 시도 할 수 있습니다.
if ($text =~ /(.*)$search(.*)/i ) {
my @before_words = split ' ', $1;
my @after_words = split ' ',$2;
my $before_str = get_last_x_words_from_array(@before_words);
my $after_str = get_first_x_words_from_array(@after_words);
print $before_str . ' ' . $search . ' ' . $after_str;
}
일부 코드는 분명히 생략되었지만 이는 접근 방식에 대한 아이디어를 제공해야합니다.
제목을 추출하는 한 ...이 접근법이 그 자체로는 그 자체로 적합하지 않다고 생각합니다.