Перейти к содержимому

Фотография

Выделение текста с помощью RegEx


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 11

#1 eRil

eRil

    Новый участник

  • Members
  • Pip
  • 11 сообщений

Отправлено 12 июля 2011 - 15:55

Помогите, пожалуйста, написать регулярку, которая будет извлекать часть УРЛа, без домена. Например есть респонс:
<body><a href="en.wikipedia.org/wiki/Islamic_State_of_Afghanistan" id=link target=_parent></body>
<script>var a=parent,b=parent.google,c=location;if(a!=window&&b){if(b.r){b.r=0;document.getElementById("link").click();}}else{document.getElementById("link").click();};</script><noscript><META http-equiv="refresh" content="0;URL='en.wikipedia.org/wiki/Islamic_State_of_Afghanistan'"></noscript>


нужно извлечь УРЛ без домена, т.е wiki/Islamic_State_of_Afghanistan

С помошью регулярки: /<a href=[/'"]([^'" >]+)/ извлекаю домен, а вот как написать подшаблон для извлечения остального адреса, не пойму!

Буду очень благодарен за помощь!
  • 0

#2 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 12 июля 2011 - 19:30

Помогите, пожалуйста, написать регулярку, которая будет извлекать часть УРЛа, без домена. Например есть респонс:

<body><a href="en.wikipedia.org/wiki/Islamic_State_of_Afghanistan" id=link target=_parent></body>
<script>var a=parent,b=parent.google,c=location;if(a!=window&&b){if(b.r){b.r=0;document.getElementById("link").click();}}else{document.getElementById("link").click();};</script><noscript><META http-equiv="refresh" content="0;URL='en.wikipedia.org/wiki/Islamic_State_of_Afghanistan'"></noscript>


нужно извлечь УРЛ без домена, т.е wiki/Islamic_State_of_Afghanistan

С помошью регулярки: /<a href=[/'"]([^'" >]+)/ извлекаю домен, а вот как написать подшаблон для извлечения остального адреса, не пойму!

Буду очень благодарен за помощь!

Можете потренироваться
http://www.regexplan...mple/index.html

У меня так получилось, если я правильно понял, что надо найти
.*<a\s+href\s*=[^/]+/([^"|']+).*
  • 0
Regards,
Alexey

#3 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 13 июля 2011 - 05:44

А я пользуюсь вот этим "полигоном" для отладки регулярных выражений: http://myregexp.com/signedJar.html
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#4 fesd

fesd

    Опытный участник

  • Members
  • PipPipPipPip
  • 262 сообщений

Отправлено 13 июля 2011 - 08:36

href=.*?/(.+?)
  • 0

#5 ch_ip

ch_ip

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 097 сообщений
  • ФИО:Павел Абдюшев
  • Город:Москва


Отправлено 13 июля 2011 - 11:17

href=.*?/(.+?)

если ссылка будет с указанием протокола, то не сработает.

a\s*href\s*=.*?[^/]/([^/][^'\s">]*)
  • 0

#6 fesd

fesd

    Опытный участник

  • Members
  • PipPipPipPip
  • 262 сообщений

Отправлено 13 июля 2011 - 12:28


href=.*?/(.+?)

если ссылка будет с указанием протокола, то не сработает.

a\s*href\s*=.*?[^/]/([^/][^'\s">]*)


ага, точно.
  • 0

#7 fesd

fesd

    Опытный участник

  • Members
  • PipPipPipPip
  • 262 сообщений

Отправлено 13 июля 2011 - 13:20

Это уже тонкости. А что если урл будет просто href="index.html", например? Думаю тут стоит отталкиваться от всех возможных вариантов ссылок. Ну или писать какой-то универсальный вариант =)
  • 0

#8 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 13 июля 2011 - 21:14

Если Вам нужен универсальный способ -- не используйте регулярные выражения.
1) Ссылку извлекайте при помощи XPath Extractor
2) Нужную часть URL-а выделяйте при помощи BeanShell Postprocessor
Например, если XPath Extractor извлекает ссылку в переменную link_src, добавьте после него BeanShell Postprocessor со следующим содержанием:
vars.put("link_src", new java.net.URL(vars.get("link_src")).getFile());

Вот только не нравится мне Ваша ссылка вида href="en.wikipedia.org/wiki/Islamic_State_of_Afghanistan"
Здесь en.wikipedia.org -- это вовсе не домен, без указания протокола ссылка интерпретируется как относительная.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#9 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 14 июля 2011 - 12:41

...
Например, если XPath Extractor извлекает ссылку в переменную link_src, добавьте после него BeanShell Postprocessor со следующим содержанием:

vars.put("link_src", new java.net.URL(vars.get("link_src")).getFile());

Вот только не нравится мне Ваша ссылка вида href="en.wikipedia.org/wiki/Islamic_State_of_Afghanistan"
Здесь en.wikipedia.org -- это вовсе не домен, без указания протокола ссылка интерпретируется как относительная.

А скорее всего на создание будет Malformed URL Exception. Проверять лень :)
  • 0
Regards,
Alexey

#10 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 14 июля 2011 - 17:00

А скорее всего на создание будет Malformed URL Exception. Проверять лень :)

Не будет эксепшена. Просто ссылка будет считаться относительной.
То есть, например, если страничка находится на localhost, тогда полный URL будет
http://localhost/en.wikipedia.org/wiki/Islamic_State_of_Afghanistan

  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#11 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 15 июля 2011 - 09:00


А скорее всего на создание будет Malformed URL Exception. Проверять лень :)

Не будет эксепшена. Просто ссылка будет считаться относительной.
То есть, например, если страничка находится на localhost, тогда полный URL будет
http://localhost/en.wikipedia.org/wiki/Islamic_State_of_Afghanistan

Странно все это. BeanShell - это джава. Джава должна кидать MalformedURLException в случае плохого урла, что она и делает.
public class Main1 {
    public static void main(String[] args) {
        try {
            System.out.println(new URL("en.wikipedia.org/wiki/Islamic_State_of_Afghanistan"));
        } catch (MalformedURLException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
}

Дает:
java.net.MalformedURLException: no protocol: en.wikipedia.org/wiki/Islamic_State_of_Afghanistan
	at java.net.URL.<init>(URL.java:567)
	at java.net.URL.<init>(URL.java:464)
	at java.net.URL.<init>(URL.java:413)
	at p1.Main1.main(Main1.java:14)

  • 0
Regards,
Alexey

#12 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 17 июля 2011 - 13:35

Мда... С кем я стал спорить про джаву :)
Признаю полное поражение и посыпаю голову пеплом ;)

Значит, придется доработать BeanShell Postprocessor -- если URL не строится (возникает исключение), тогда надо добавлять к нему base url запроса и пробовать ещё раз.

  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных