Анализ HTML - помогите с регулярным выражением?

lantastic

Новичок
Анализ HTML - помогите с регулярным выражением?

Приветствую!

Есть HTML-файл. Как получить из него только текст, наподобие того, какой выводится браузером? strip_tags() не подходит - вырезает теги, оставляя кучу ненужной информации (содержимое ява-скриптов например) ...

Есть мысль: вытащить содержимое самых вложенных тегов, то есть внутри которых уже не будет других тегов? Как вот это сделать? помогите с регулярным выражением...
 

diamond_krnl

pure-php
$text = preg_replace("~<script[^>]*?>.*?</script>~si", '', $html);
$text = preg_replace("~<style[^>]*?>.*?</style>~si", '', $html);
$text = ("~<br[^>]*?/?>~si", "\n", $text);
$text = strip_tags($text);
$text = html_entity_decode($text);
 

valyala

Новичок
Есть мысль: вытащить содержимое самых вложенных тегов, то есть внутри которых уже не будет других тегов? Как вот это сделать? помогите с регулярным выражением...
PHP:
/**
    выдирает содержимое самых вложенных тэгов.
    Возвращает массив, состоящий из массивов вида:
        array(
            'tag' => 'имя_тэга',
            'contents' => 'содержимое_тэга',
        );
    для каждого найденного самого вложенного тэга.
*/
function get_deep_childs_content($str)
{
    $tag_params = '(?>(?>[^>"\']|"[^"]*"|\'[^\']*\')*)';

    // удаляем HTML-комментарии
    $str = preg_replace("~<!--.*?-->~s", '', $str);
    // удаляем содержимое скриптов и стилей
    $str = preg_replace("~<script{$tag_params}>.*?</script{$tag_params}>~si", '', $str);
    $str = preg_replace("~<style{$tag_params}>.*?</style{$tag_params}>~si", '', $str);
    // выдираем содержимое самых вложенных тэгов
    preg_match_all("~<([a-z]+){$tag_params}(?<!/)>((?:[^<]|<[^a-z])*)</\\1{$tag_params}>~i", $str, $matches);

    // формируем результирующий массив
    $tmp = array();
    $n = sizeof($matches[2]);
    for ($i = 0; $i < $n; $i++) {
        $tmp[] = array(
            'tag' => strtolower($matches[1][$i]),
            'contents' => $matches[2][$i],
        );
    }
    return $tmp;
}
 

Domovoj

Guest
Может и не совсем по теме, но посмотри ещё "htmlspecialchars()". Она заменяет все "<" и ">" на &lt; и &gt; так, что тэги отображаются как обычный текст.

Это самый надёжный метод, если ты просто хочешь не давать пользователям постить html тэги.
 
Сверху