Как да изрежете текст, поставен между две думи, използвайки регулярен израз?

I'm beginner in regular expressions and I want to cut some text placed beeween two other words. I'm using QT to do it. Some exapmle:

<li class="wx-feels">
Feels like <i><span class="wx-value" itemprop="feels-like-temperature-fahrenheit">55</span>&deg;</i>
</li>

Искам да получа Feels like <i><span class="wx-value" itemprop="feels-like-temperature-fahrenheit">55</span>&deg;

От кода по-горе, по-специално число 55, идеята ми беше първо да изрежа цял ред от текст и след това да го търся за числа, но не мога да го възстановя от целия текст.

Написах нещо подобно:

QRegExp rx("(Feels like <i><span class=\"wx-value\" itemprop=\"feels-like-temperature-fahrenheit\">)[0-9]{1,3}(</span>&deg;</i>)");
QStringList list;
list = all.split(rx);

Когато all е цял текст, но списъкът съдържа само онези поднизове, които не исках, има ли възможност QString да се раздели на три части? Първо - текст в началото (което не искам) Второ - желан текст Трето - останал текст?


person Filip J    schedule 01.06.2013    source източник


Отговори (1)


Описание

Този регулярен израз ще събере вътрешния низ в маркерите li, където маркерът li има клас wx-feels, също така ще улови числовата стойност вътре в маркера span.

<li\b[^>]*\bclass=(["'])wx-feels\1[^>]*?>(.*?\bitemprop=(['"])feels-like-temperature-fahrenheit\3[^>]*>(\d+).*?)<\/li>

въведете описание на изображението тук

Групи

Група 0 получава целия низ, включително отворените и затворените LI тагове

  1. получава отворената кавичка за атрибута на клас LI. Това ни позволява да намерим правилната котировка за затваряне след стойността
  2. вземете низа директно в тага LI
  3. получава отворената оферта за атрибута itemprop
  4. получава цифрите от вътрешния текст на обхвата

Пример

Този PHP пример просто показва как работи регулярният израз.

<?php
$sourcestring="<li class=\"wx-feels\">
Feels like <i><span class=\"wx-value\" itemprop=\"feels-like-temperature-fahrenheit\">55</span>&deg;</i>
</li>";
preg_match('/<li\b[^>]*\bclass=(["\'])wx-feels\1[^>]*?>(.*?\bitemprop=([\'"])feels-like-temperature-fahrenheit\3[^>]*>(\d+).*?)<\/li>/ims',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>
 
$matches Array:
(
    [0] => <li class="wx-feels">
Feels like <i><span class="wx-value" itemprop="feels-like-temperature-fahrenheit">55</span>&deg;</i>
</li>
    [1] => "
    [2] => 
Feels like <i><span class="wx-value" itemprop="feels-like-temperature-fahrenheit">55</span>&deg;</i>

    [3] => "
    [4] => 55
)

Опровержение

Анализирането на html с регулярен израз може да бъде проблематично поради големия брой крайни случаи. Ако вие контролирате въведения текст или ако той винаги е елементарен като вашия пример, тогава не би трябвало да имате проблем.

Ако QT има такъв, препоръчвам да използвате инструмент за анализ на HTML, за да заснемете тези данни.

person Ro Yo Mi    schedule 01.06.2013