#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, но в целом все работало нормально