Я пытаюсь извлечь текст с помощью 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.
Был бы признателен за любую помощь в этом, спасибо.
Чтобы узнать, почему @barmar прав, см. Этот вопрос и ответ: stackoverflow.com/a/1732454/870729
@Barmar Спасибо за ответ. Поскольку мой текст взят не из файла html или xml как такового, а из базы данных, у него нет тега body или head. Я проверил, что синтаксический анализатор обращается к узлам с помощью getElementsByTagName, но нужный мне текст отсутствует в тегах. Есть ли способ получить текст, которого нет в тегах?
@claris Вы хотите сказать, что ваша база данных содержит теги разметки HTML?
@Funk Forty Niner Да, к сожалению, поскольку я работаю над устаревшей системой, база данных содержит теги разметки HTML.
@claris Я просто добавляю тег "база данных", видя актуальность. Вероятно, вам придется обновить свой вопрос, содержащий схему db, значения и api, используемый для подключения. Вы также можете изучить использование РЕГЭКСП в MySQL, если это используемая СУБД, если это то, что вы пробовали, а не PHP.
@FunkFortyNiner Тот факт, что данные находятся в базе данных, совершенно не имеет значения.
@claris Вы можете / должны использовать парсер DOM, даже если ваши данные не имеют тегов body и head. Полный документ не требуется ... фрагмент в порядке.
@Funk Forty Niner Я пытаюсь извлечь текст в PHP после его получения из базы данных. Я не слишком уверен, как я могу использовать регулярное выражение в mysql. Спасибо за ответ
@Brad Хорошо, я попробую использовать парсер DOM, спасибо за ответ






Вы можете использовать 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
)
Лучше использовать парсер DOM, регулярные выражения для HTML всегда хрупкие.