Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Skillable от Октябрь 27, 2011, 16:33



Название: Помогите перевести регулярное выражение
Отправлено: Skillable от Октябрь 27, 2011, 16:33
Здравствуйте!
Нашел на просторах интернета регулярное выражение, которое очеть помогло бы мне в составлении моей программы.

Выражение на php:
Код
PHP
$pattern = '|<a(.*?)href[\"\'\s]{0,}=[\"\'\s]{0,}(.*?)[\"\'\s]{1}(.*?)>(.*?)</a[\s]{0,}>|is';

Помогите, пожалуста, перевести это выражение в вид, который бы съел QRegExp


Название: Re: Помогите перевести регулярное выражение
Отправлено: kambala от Октябрь 27, 2011, 16:55
Код
C++ (Qt)
QRegExp rx("|<a(.*?)href[\\\"\\'\\s]{0,}=[\\\"\\'\\s]{0,}(.*?)[\\\"\\'\\s]{1}(.*?)>(.*?)</a[\\s]{0,}>|is");


Название: Re: Помогите перевести регулярное выражение
Отправлено: Skillable от Октябрь 27, 2011, 17:47
нет, не похоже.

Кокретно ворую выражение отсюда: http://tushov.ru/post/545, на пхп проверяю, работает.

мой тестовый код на Qt, если бы выражение работало, должно было бы возвращать что-то кроме -1:
Код
C++ (Qt)
QRegExp lRESearchLinks("<a(.*?)href[\\\"\\'\\s]{0,}=[\\\"\\'\\s]{0,}(.*?)[\\\"\\'\\s]{1}(.*?)>(.*?)</a[\\s]{0,}>", Qt::CaseInsensitive);
int lPos = lRESearchLinks.indexIn(ui->memTestInput->toPlainText());

не так ли?


Название: Re: Помогите перевести регулярное выражение
Отправлено: kambala от Октябрь 27, 2011, 18:35
ах, тут палочки в качестве разделителей используются (хотя часто заключают в //), а последние 2 буквы - параметры поиска (игнорирование регистра и неигнорирование перехода на новую строку). тогда будет так:
Код
C++ (Qt)
QRegExp lRESearchLinks("<a(.*)href[\\\"\\'\\s]{0,}=[\\\"\\'\\s]{0,}(.*)[\\\"\\'\\s]{1}(.*)>(.*)</a[\\s]{0,}>");
lRESearchLinks.setCaseSensitivity(Qt::CaseInsensitive);
lRESearchLinks.setMinimal(true);


Название: Re: Помогите перевести регулярное выражение
Отправлено: Skillable от Октябрь 27, 2011, 21:29
kambala, спасибо!
А не подскажешь, как эту штуку еще можно подправить, дабы выдирать значение параметра href ссылок?
Сейчас lRESearchLinks.capturedTexts().join("\n") мне выводят следующее для входного текста:
Код
C++ (Qt)
входной: <a href = 'http://mail.ru' title = 'Майл.ру' >Mail.ru</a >
выход:
<a href = 'http://mail.ru' title = 'Майл.ру' >Mail.ru</a >
 
'http://mail.ru' title = 'Майл.ру'
 
Mail.ru
 

пхп мне в одном из capured текстов выводило только содержание href


Название: Re: Помогите перевести регулярное выражение
Отправлено: kambala от Октябрь 27, 2011, 22:08
вообще странно что результат такой. lRESearchLinks.setMinimal(true) точно выставил?

если тебе надо сугубо ссылку, то вот так должно быть попроще, но кавычки из ссылки придется самому удалить если таковые имеются:
Код
C++ (Qt)
QRegExp lRESearchLinks("<a\\s+href\\s*=\\s*(.+)\\s*.*>");
lRESearchLinks.setCaseSensitivity(Qt::CaseInsensitive);
lRESearchLinks.setMinimal(true);

есть гарантии что абсолютно все ссылки заключены в кавычки (любые)? :) тогда можно еще упростить:
Код
C++ (Qt)
QRegExp lRESearchLinks("<a\\s+href\\s*=\\s*(.)(.+)\\1");
lRESearchLinks.setCaseSensitivity(Qt::CaseInsensitive);
lRESearchLinks.setMinimal(true);
и ссылка будет в lRESearchLinks.cap(2)


Название: Re: Помогите перевести регулярное выражение
Отправлено: thechicho от Октябрь 27, 2011, 22:54
Исчерпывающий парсинг ссылок в тексте - сильно звучит  :D
порт того говна в кьюти:

Код
C++ (Qt)
QString str = "<a href = 'http://mail.ru' title = 'Майл.ру' >Mail.ru</a ><br /><a title=\"Яндекс\" href=\"http://yandex.ru\">Yandex.ru</a><br /><a  title=\"Яндекс\" href=http://google.ru style=\"font-size: 12pt;\">Google</a><br /><a  href = http://rambler.ru  targer = _blank>Rambler</a><br />";
 
   QRegExp rx("<a(.*)href[\"' ]*=[\"' ]*([^\"' ']*)[\"' ]+(.*)>(.*)</a[ ]*>");
   rx.setCaseSensitivity(Qt::CaseInsensitive);
   rx.setMinimal(true);
   QStringList all;
   QStringList one;
   QStringList two;
   QStringList three;
   QStringList four;
   int pos = 0;
   while ((pos = rx.indexIn(str, pos)) != -1) {
       all << rx.cap(0);
       one << rx.cap(1);
       two << rx.cap(2);
       three << rx.cap(3);
       four << rx.cap(4);
       pos += rx.matchedLength();
   }
   qDebug() << all << endl;
   qDebug() << one << endl;
   qDebug() << two << endl;
   qDebug() << three << endl;
   qDebug() << four << endl;


Название: Re: Помогите перевести регулярное выражение
Отправлено: Skillable от Октябрь 28, 2011, 11:48
Спасибо!