Извлечь текст за пределами тегов html

Я пытаюсь извлечь текст с помощью preg_match(), которого нет в таких тегах, как <p> или <img>. Этот текст извлекается из базы данных, и я работаю на PHP.

This should be extracted <p>I do not want this</p> This should be extracted <a>This may appear after other tags and I do not want this</a>

Я пытался сделать (.*)(<p>|<a>|</p>|</a>)(.*), но это захватит все до последнего тега, а более ранние теги захватываются вместе с текстом вне тегов.

Я пробовал искать в Stackoverflow вот так: Соответствовать тексту за пределами тегов html, но в предоставленном регулярном выражении есть ошибка шаблона, когда я вставил его в regex101.com.

Был бы признателен за любую помощь в этом, спасибо.

Лучше использовать парсер DOM, регулярные выражения для HTML всегда хрупкие.

Barmar 22.12.2018 02:17

Чтобы узнать, почему @barmar прав, см. Этот вопрос и ответ: stackoverflow.com/a/1732454/870729

random_user_name 22.12.2018 02:24

@Barmar Спасибо за ответ. Поскольку мой текст взят не из файла html или xml как такового, а из базы данных, у него нет тега body или head. Я проверил, что синтаксический анализатор обращается к узлам с помощью getElementsByTagName, но нужный мне текст отсутствует в тегах. Есть ли способ получить текст, которого нет в тегах?

claris 22.12.2018 02:40

@claris Вы хотите сказать, что ваша база данных содержит теги разметки HTML?

Funk Forty Niner 22.12.2018 03:21

@Funk Forty Niner Да, к сожалению, поскольку я работаю над устаревшей системой, база данных содержит теги разметки HTML.

claris 22.12.2018 03:47

@claris Я просто добавляю тег "база данных", видя актуальность. Вероятно, вам придется обновить свой вопрос, содержащий схему db, значения и api, используемый для подключения. Вы также можете изучить использование РЕГЭКСП в MySQL, если это используемая СУБД, если это то, что вы пробовали, а не PHP.

Funk Forty Niner 22.12.2018 03:52

@FunkFortyNiner Тот факт, что данные находятся в базе данных, совершенно не имеет значения.

Brad 22.12.2018 05:23

@claris Вы можете / должны использовать парсер DOM, даже если ваши данные не имеют тегов body и head. Полный документ не требуется ... фрагмент в порядке.

Brad 22.12.2018 05:23

@Funk Forty Niner Я пытаюсь извлечь текст в PHP после его получения из базы данных. Я не слишком уверен, как я могу использовать регулярное выражение в mysql. Спасибо за ответ

claris 22.12.2018 14:57

@Brad Хорошо, я попробую использовать парсер DOM, спасибо за ответ

claris 22.12.2018 14:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
10
417
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать PHP DOMDocument и DOMXPath, чтобы получить нужные вам значения. Уловка состоит в том, чтобы обернуть HTML-код из вашей базы данных (например) тегом <div>, а затем вы можете загрузить его в DOMDocument и использовать DOMXPath для поиска дочерних элементов тега <div>, которые являются чисто текстовыми, используя путь text():

$html = 'This should be extracted <p>I do not want this</p> This should also be extracted <a>This may appear after other tags and I do not want this</a>';
$doc = new DOMDocument();
$doc->loadHTML("<div>$html</div>", LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
$xpath = new DOMXPath($doc);
$texts = array();
foreach ($xpath->query('/div/text()') as $text) {
    $texts[] = $text->nodeValue;
}
print_r($texts);

Вывод:

Array ( 
    [0] => This should be extracted
    [1] =>  This should also be extracted 
)

Демо на 3v4l.org

Другие вопросы по теме