Регулярные выражения для захвата текста вокруг тегов ?

#regex

#регулярное выражение

Вопрос:

У меня есть куча продуктов, для которых мне нужен заголовок и текст описания, чтобы я мог поместить их в запрос, который выглядит примерно так: ВСТАВЬТЕ В uc_products (название, описание) значения (‘Стереофоническая магнитола Lafayette RK-820 с 4 дорожками’, ‘Руководство по эксплуатации и обслуживанию, включает список запчастей и схему’),

В настоящее время информация собирается в некоторых тегах div:

 <div class="radio-product-wrap">
    <div class="radio-product-image">

    </div>
    <div class="radio-product-title">
        <p>Lafayette RK-820 4 track stereo tape deck</p>
    </div>
    <div class="radio-product-desript">
        <p>Operation and service manual, includes parts list amp;amp;amp; schematic</p>
    </div>
    <div class="radio-cart-66-wrap">
        [add_to_cart item="L-1"]
    </div>
</div>
  

Как бы мне написать регулярное выражение для получения информации?

Комментарии:

1. СКУЛЬПТУРНОЕ ПРЕДУПРЕЖДЕНИЕ: Использование регулярных выражений для этого типа синтаксического анализа html опасно. Рассмотрите возможность использования вместо этого простого синтаксического анализатора HTML.

2. Я поддерживаю то, что говорит @anubhava, вам также будет проще в долгосрочной перспективе для такого рода вещей. Если вы укажете, какой язык вы используете, вы можете получить некоторые рекомендации для синтаксических анализаторов. Кстати, отличное имя пользователя, лучший диджей.

3. Это предупреждение явно верно не для всех случаев. Это ОЧЕНЬ верно, если кто-то хочет проанализировать произвольные HTML-документы. Однако, как я отмечаю в своем ответе, извлечение предсказуемых элементов из четко определенного HTML-кода является отличным вариантом использования регулярных выражений, и при этом они работают исключительно хорошо.

Ответ №1:

На каком целевом языке? Или вам просто требуется само регулярное выражение?

Обратите внимание, что регулярные выражения полезны только при извлечении четко определенных частей HTML-документов и не могут использоваться для общего разбора HTML.

Если все, что вам нужно, это регулярное выражение, вы могли бы использовать:

 <div class="radio-product-title">    # literal div tag with class

[^<]*                                 # any chars that are not '<'

<p>                                   # literal '<p>' tag

s*                                   # optional leading spaces

([^<] ?)                              # one or more chars that are not '<', 
                                      #   captured in to group #1
                                      # (non-greedy)

s*                                   # optional trailing spaces

</p>                                 # literal '</p>' tag

[^<]*                                 # any chars that are not '<'

</div>                               # literal '</div>' end tag

[^<]*                                 # any chars that are not '<'

<div class="radio-product-desript">  # literal div tag with class

[^<]*                                 # any chars that are not '<'

<p>                                   # literal '<p>' tag

s*                                   # optional leading spaces

([^<] ?)                              # one or more chars that are not '<', 
                                      #   captured in to group #2
                                      # (non-greedy)

s*                                   # optional trailing spaces

</p>                                 # literal '</p>' tag
  

То же самое без комментариев:

 <div class="radio-product-title">[^<]*<p>s*([^<] ?)s*</p>[^<]*</div>[^<]*<div class="radio-product-desript">[^<]*<p>s*([^<] ?)s*</p>
  

Это регулярное выражение предполагает, что между тегами <p> и </p> нет символов ‘<‘. ЕСЛИ это не так, то его необходимо будет пересмотреть.

В зависимости от вашего целевого языка вам может потребоваться указать вашему движку регулярных выражений обрабатывать исходную строку как «однострочную» во время обработки.

По завершении сопоставление [1] будет содержать заголовок, а сопоставление [2] — описание.


ОТРЕДАКТИРУЙТЕ в ответ на комментарий с предупреждением…

Хотя верно, что вы не можете использовать регулярные выражения для надежного разбора произвольных HTML-документов, они являются отличным инструментом для извлечения элементов из таких документов, если:

  1. Формат одинаков для всех документов.
  2. Целевые элементы четко определены и легко узнаваемы.

Предостерегать людей от использования регулярных выражений при извлечении данных в этих условиях — значит поддаваться догме без понимания.

Ответ №2:

Это должно сработать:

 <div class="radio-product-title">.*?<p>(?<Title>.*?)</p>.*?</div>.*?<div class="radio-product-desript">.*?<p>(?<Description>.*?)</p>.*?</div>
  

Вам нужно захватить две названные группы Title и Description из совпадения.