Проблема с регулярным выражением в Perl-скрипте

processLine('23/05/2017 07:10:58 [6] 00-Always: ACTION=QUERY&Text=iphone%205%20has%20no%20network%2A&Summary=Context&SpellCheck=true&QuerySummary=false&Sort=AutnRank%2BRelevance&Synonym=true&TotalResults=true&MaxResults=10&PrintFields=drereference%2Cdretitle%2Ccontenttype%2Cautnrank%2COPTUS%5FFILTER1%2COPTUS%5FFILTER2%2COPTUS%5FFILTER3%2CCANONICAL%5FURL&Start=1&Predict=false&FieldText=%28MATCH%7BMy%20Optus%20Community%7D%3AOPTUS%5FFILTER1%3AOPTUS%5FFILTER2%3AOPTUS%5FFILTER3%20NOT%20MATCH%7Bsmb%7D%3ACONTEXT%20NOT%20MATCH%7BCustom%5FPromotions%7D%3ADREDBNAME%29%2BOR%2B%28%28MATCH%7BCustom%5FPromotions%7D%3ADREDBNAME%29%2BAND%2B%28BIASVAL%7Biphone%205%20has%20no%20network%2A%2C100%7D%3APromotion%5FKeywords%29%2BAND%2B%28MATCH%7Biphone%205%20has%20no%20network%2A%7D%3APromotion%5FKeywords%29%29&Combine=Simple&Characters=250 (127.0.0.1)');
if (defined $query && defined $ip && $query =~ m!/?a.*?=(\w+)([?&].*(?<=[?&])Text=([^?&]*))?!) 
{
        $events++;
        my $action = $1;
        my $terms = uri_unescape($3) || "";
}

Я ищу раздеться iphone%205%20has%20no%20network%2A от Text=iphone%205%20has%20no%20network%2А и хранить в $3, Я проверил регулярное выражение и, кажется, не найти проблему. Это печатает $3 как контекст.

Ожидание $3 выводит значение как iphonehasnonetwork

Когда я прохожу,

processLine('25/05/2017 14:48:10 [9] 00-Always: action=Query&text=samsung&databasematch=Help_Support&ResponseFormat=json&_=1495687690880 (127.0.0.1)');

Это печатает $3 как QuerySamsung, Это ожидаемый результат.

Я новичок в Perl, и я хочу изменить это регулярное выражение и решить эту проблему. Я уже разобрал свой Perl-скрипт и диагностировал проблему с корнем. Это регулярное выражение выглядит хорошо для меня после тестирования отдельных компонентов регулярного выражения в http://regex101.com/

2 ответа

Решение

Вы забыли добавить модификатор игнорирования регистра в свое регулярное выражение:

$query =~ m!/?a.*?=(\w+)([?&].*(?<=[?&])Text=([^?&]*))?!i

увидеть i в конце?

читайте больше здесь: https://perldoc.perl.org/perlre.html

Я не уверен, какие еще проблемы есть у вашего регулярного выражения, но я вижу: 1) группы захвата пронумерованы открывающей скобкой, поэтому я думаю, что вы хотите $4, а не $3 2) "Текст" может позже соответствовать "FieldText" в строке

Вы действительно должны просто правильно проанализировать URI, разделив все аргументы (&), а затем разделив пары ключ-значение (=)

Другие вопросы по тегам