Получить содержимое между тегами с переменным атрибутом - PullRequest
0 голосов
/ 03 июля 2019

У меня проблемы с написанием регулярного выражения.
Мне нужно получить строку, содержащуюся между <cite></cite> тегами, я использовал этот шаблон
'/>(.*)<\/cite>/', но из-за изменившихся потребностей этот тег может теперьсодержать или нет атрибут title с переменным содержимым, и ему могут предшествовать или нет другие теги.

Некоторые примеры возможных строк:
* <cite>Jhon</cite>
* <cite title="a title">Jhon</cite>
* <cite title="another title">Jhon</cite>
* <blockquote>....<cite title="title">Jhon</cite></blockquote>

Таким образом, мой шаблон больше не работает, так как, например, из последней строки он будет принимать что-нибудь между > тега <blockquote>и </cite>.

Как мне изменить свое регулярное выражение, чтобы получить Jhon из этих строк?

Ответы [ 2 ]

3 голосов
/ 03 июля 2019

Это должно сделать это

<cite[^>]*>([^<]+)<\/cite> 

Пояснение

  • <cite[^>]*> соответствует, пока > не будет найдено (Non Greedy)

  • ([^<]+) совпадение, пока не будет найдено < (сгруппировать средний текст). Считайте первую группу совпадений

  • <\/cite> найден закрывающий тег совпадения </cite> найден

вот демо https://regex101.com/r/6RtBfC/1

PS Использование регулярных выражений для разбора тегов HTML не рекомендуется

1 голос
/ 03 июля 2019

EDIT: обновлено регулярное выражение для захвата нескольких тегов, присутствующих в одной строке.

Использование регулярного выражения для анализа XML является идеей плохой .Если вы все еще заинтересованы в решении на основе регулярных выражений, подойдет следующее:

<cite.*?>(.*?)<\/cite>

Все, что я делаю, - это использование начала тега <cite> в моем регулярном выражении,наряду с любыми атрибутами, которые он может содержать.Ленивый подход используется для захвата нескольких тегов, доступных в одной строке.

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...