Я пытаюсь заставить это работать с regex perl, но, может казаться, не понимаю это.. Я хочу захватить любой URL, который имеет ".website". в нем, кроме, которые похожи на это (с "en", предшествующим ".website".
$linkhtml = 'http://en.search.website.com/?q=beach&' ;
Это - пример URL, что я хотел бы быть возвращенным regex, в то время как тот выше отклоняется
$linkhtml = ' http://exsample.website.com/?q=beach&' ;
Вот моя попытка его.. любой совет относительно того, что я делаю неправильно, ценится
$re2='(?<!en)'; # Any number of characters
$re4='(.*)'; # Any number of characters
$re6='(\.)'; # Any Single Character 4
$re7='(website)'; # Word 2
$re8='(\.)'; # Any Single Character 5
$re9='(.*)'; # Any number of characters
$re=$re4.$re2.$re6.$re7.$re8.$re9;
if ($linkhtml =~ /$re/)
Негативные утверждения lookbehind не работают, если содержимое, которое вы пытаетесь проверить после утверждения, настолько общее, что оно будет соответствовать самому утверждению. Рассмотрим:
perl -wle'print "en.website" =~ qr/(?<!en\.)web/' # doesn't match
perl -wle'print "en.website" =~ qr/(?<!en\.)[a-z]/' # does match, because [a-z] is matching the 'en'
Лучше всего здесь поступить так, как предложил Дэвид: использовать два шаблона для отсеивания хороших и плохих значений:
my @matches = grep {
/$pattern1/ and not /$pattern2/
} @strings;
...где шаблон1 соответствует всем URL, а шаблон2 соответствует только URL 'en'.
Я бы просто сделал это в два шага: сначала используйте общее регулярное выражение для проверки любого URL-адреса (или, скорее, всего, что похоже на URL-адрес). Затем проверьте каждый результат, совпадающий с этим, с другим регулярным выражением, которое ищет en
на хосте до wordpress
, и отбросьте все, что соответствует.
Вот окончательное решение на тот случай, если кто-то столкнется с этим в будущем, которое является новым для регулярных выражений (как и я) и имеет аналогичную проблему .. в моем случае я заключил это в " for loop ", чтобы он проходил через массив, но это просто зависит от потребности.
$re1='(.*)'; # Any number of characters
$re2='(en)'; # Word 1
$re3='(.*)'; # Any number of characters
$re=$re1.$re2.$re3;
if ($linkhtml =~ /$re/)
{
#do nothing, as we don't want a link with "en" in it
}
else {
### find urls with ".website."
$re1='(.*)'; # Any number of characters
$re2='(\.)'; # period
$re3='(website)'; # Word 1
$re4='(\.)'; # period
$re5='(.*)'; # Any number of characters
$re=$re1.$re2.$re3.$re4.$re5;
if ($linkhtml =~ /$re/) {
#match to see if it is a link that has ".website." in it
## do something with the data as it matches, such as:
print "linkhtml
}
}