2015-04-18 2 views
1

Я очень новенький в Perl.Perl регулярные выражения сравнить текстовую форму HTML

Ранее два текста сравниваются следующим образом:

 if($arr1[$k1-1] eq $arr2[$k2-1]) 

Сейчас я ищу решение регулярных выражений Perl для сравнения двух строк друг с другом в форме, что он

  • игнорирует чувствительность к регистру
  • Все символы препинания игнорируются
  • Все теги HTML, такие как <B>, <BR />, <img src="aaaa.png" />, </B> игнорируются

мне также нужно количество слов, которые отличаются между двумя текстами (независимо от вышеупомянутых случаев)

Есть ли решение для этого в Perl?

+0

Упоминание HTML тегов заставляет меня думать, что вам нужно парсер против регулярных выражений, каковы фактические строки, которые вы хотите сравнить? – salparadise

+0

Мне также нравится использовать что-нибудь еще. Но мы вынуждены использовать регулярное выражение. Это вопрос, который требует использования. Пока нет примера. – barej

ответ

1

посмотрите на Text::WordDiff или String::Diff модуль (возможно, Text::Diff тоже достаточно).

Только по кодированию, я думаю, это невозможно сделать за один шаг.

без модулей я должен сделать следующие шаги:

Сначала удалите все HTML-теги и знаки препинания (заменить их ничем или одним пробелом, в зависимости от того, что вы хотите, они слово separater или нет), и после этого вы могут сравнивать их или подсчитывать различия.

1: удаление HTML-теги и пунктуация:

$string =~ s/<[^>]+?>|[[:punct:] ]/ /igm; #replace with space in this case 

после этого удалить несколько пробелов - не нужно, если вы используете /x - ($string =~ s/\s+/ /igm;), и сравнить их с эк или регулярным выражением ($string1 =~ //is;), используя/х модификатор (/ x = Extended с пробелами и комментариями и зависит от используемого вами двигателя regex).

После этого вам нужна функция для исключения слов, присутствующих в обоих текстах (я думаю, что множественное присутствие тоже игнорируется) и получить счет оставшегося массива.

примеры кода можно найти here

Я надеюсь, что это помогает.

-1
#subroutine to clean html tags, pontuation and spaces > 2 
sub clean { 
my ($string) = @_; 
$string =~ s/(<.+?>|[^\w\s])//ig; 
$string =~ s/[\s]{2,}//ig; 
return $string; 
} 

#clean the strings 
my $str1 = clean('<B>, <BR />, <img src="aaaa.png" />, </B> test 123'); 
my $str2 = clean('<B>, test 123 <BR />, <im g src="aaaa.png" />, </B>'); 


#compare two strings 
if($str1 eq $str2){ 
print "equal" 
}else{ 
print "not equal"; 
} 

LIVE DEMO

+1

Упомяните проголосовать? –

Смежные вопросы