Russian Qt Forum
Апрель 29, 2024, 12:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите перевести регулярное выражение  (Прочитано 3587 раз)
Skillable
Гость
« : Октябрь 27, 2011, 16:33 »

Здравствуйте!
Нашел на просторах интернета регулярное выражение, которое очеть помогло бы мне в составлении моей программы.

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

Помогите, пожалуста, перевести это выражение в вид, который бы съел QRegExp
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Октябрь 27, 2011, 16:55 »

Код
C++ (Qt)
QRegExp rx("|<a(.*?)href[\\\"\\'\\s]{0,}=[\\\"\\'\\s]{0,}(.*?)[\\\"\\'\\s]{1}(.*?)>(.*?)</a[\\s]{0,}>|is");
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Skillable
Гость
« Ответ #2 : Октябрь 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());

не так ли?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #3 : Октябрь 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);
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Skillable
Гость
« Ответ #4 : Октябрь 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
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #5 : Октябрь 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)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
thechicho
Гость
« Ответ #6 : Октябрь 27, 2011, 22:54 »

Исчерпывающий парсинг ссылок в тексте - сильно звучит  Веселый
порт того говна в кьюти:

Код
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;
« Последнее редактирование: Октябрь 27, 2011, 22:57 от thechicho » Записан
Skillable
Гость
« Ответ #7 : Октябрь 28, 2011, 11:48 »

Спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.482 секунд. Запросов: 22.