Preg_match_all шаблоны, кроме

#php #regex #preg-match #preg-match-all

#php #регулярное выражение #preg-совпадение #preg-совпадение-всех

Вопрос:

Я пытаюсь получить все вхождения определенного тега из текстового поля и извлечь только часть его содержимого

 <h4>
TEXT TO RETRIEVE HERE
<br>
EVERYTHING ELSE
</h4>
  

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

 <br>
EVERYTHING ELSE
  

Я попробовал следующий preg_match_all, но безуспешно:

 preg_match_all('/<h4>(.*?)<br>.*</h4>/ims', $text, $match)
  

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

1. Как вы пришли к выводу использовать регулярное выражение для этого? И почему бы вам не уточнить свойства содержащегося в нем контекста строки? Действительно ли ваш пример отражает то, что вы на самом деле пытаетесь сделать?

2. Привет, Марио, можешь ли ты объяснить, что ты имеешь в виду, когда говоришь, что я должен подробнее рассказать о свойствах содержащегося в нем контекста строки? Я имею в виду, у меня есть содержимое, которое я извлекаю из текстового поля базы данных MYSQL, у меня есть несколько записей H4 внутри него, в которых мне нужно извлечь часть содержимого и отобразить его по-другому. Итак, да, кажется, что preg_match_all имеет больше смысла, если у вас нет чего-то другого, что могло бы быть лучшим решением?

Ответ №1:

Попробуйте:

 <h4>.*?(?=<br>|$)
  

с включенными параметрами «точка соответствует разрыву строки» и ^$ не совпадает при разрыве строки

Если вам нужно убедиться, что закрывающий тег существует в конце, вы можете попробовать:

 <h4>.*?(?=(?:<br>.*</h4>)|(?:</h4>))
  

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

1. Спасибо, но это не сработало, может быть, потому, что тег br иногда пишется br /, а иногда и без косой черты? И да, мне действительно нужно убедиться, что есть закрывающий тег h4, потому что есть много случаев, когда BR не существует … также имейте в виду, что существует более 1 появления H4 на странице, и я должен получить их все

2. @PHPFever Что ж, без знания вариативности ваших данных создание ответа — это ошибка. Я рад, что один из них «попал»

Ответ №2:

Я думаю, вам нужно что-то вроде этого,

 <h4>((?:(?!<br>).)*)(?=<br>|</h4>)
  

Он фиксирует значения после <h4> тега, которые не равны <br> нулю или более раз. И за ним должен следовать <br> тег или </h4> tag.

ДЕМОНСТРАЦИЯ

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

1. Спасибо, Авинаш, твой ответ сработал. Мне пришлось изменить <br> with <br из-за множественного форматирования BR, но в целом все работало нормально