Как извлечь весь текст из файла HTML с помощью PHP? - PullRequest
0 голосов
/ 02 октября 2009

как извлечь весь текст из файла HTML

Я хочу извлечь весь текст, в атрибутах alt, тегах

и т. Д.

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

Спасибо

сейчас у меня есть следующий код

    <?PHP
    $string =  trim(clean(strtolower(strip_tags($html_content))));
    $arr = explode(" ", $string);
    $count = array_count_values($arr);
    foreach($count as $value => $freq) {
          echo trim ($value)."---".$freq."<br>";
    }

    function clean($in){
           return preg_replace("/[^a-z]+/i", " ", $in);
    }

    ?>

Это прекрасно работает, но возвращает теги сценариев и стилей, которые я не хочу получать и другая проблема, я не уверен, что он действительно получает атрибуты, такие как alt - так как функция strip_tags может удалить все теги HTML с их атрибутами

Спасибо

Ответы [ 5 ]

7 голосов
/ 02 октября 2009

Лично я считаю, что вам следует переключиться на какой-либо XML-ридер (SimpleXML, Document Object Model или XMLReader) для анализа HTML документ. Я бы взял комбинацию DOM, SimpleXML и XPath , чтобы извлечь то, что вам нужно - все остальное потерпит неудачу при разборе произвольных документов:

$dom = new DOMDocument();
$dom->loadHTML($html_content); // use DOMDocument because it can load HTML
$xml = simplexml_import_dom($dom); // switch to SimpleXML because it's easier to use.
$pTags = $xml->xpath('/html/body//p');
$tagsWithAltAttribute = $xml->xpath('/html/body//*[@alt]');
// ...
0 голосов
/ 31 мая 2010

Я отправил это как ответ на другой пост, но здесь это снова:

Мы только что запустили новый API обработки естественного языка на repustate.com . Используя REST API (так что просто используйте curl), вы можете очистить любой HTML или PDF и вернуть только текстовые части. Наш API бесплатный, поэтому не стесняйтесь использовать его для своего сердца. Проверьте это и сравните результаты с readability.js - я думаю, вы обнаружите, что они почти на 100% одинаковы.

0 голосов
/ 02 октября 2009

Любой вид синтаксического анализа не подходит, если вы не уверены, что источником является 100% правильно сформированный XML (а HTML4 по определению - нет).

Простого preg_replace должно быть достаточно. Что-то вроде

preg_replace('/<(script|style).*>.*<\/\1>/i', '', $html);

должно быть достаточно, чтобы заменить все элементы скрипта и стиля и их содержимое пустой строкой (т.е. обрезать их).

Однако, если вы хотите избежать XSS-атак, вам лучше использовать HTML-дезинфицирующее средство для нормализации HTML, а затем убрать весь плохой код.

0 голосов
/ 02 октября 2009

сначала вы можете найти блоки и и удалить их из HTML.

У меня есть эта функция, я использую много

        function search($start,$end,$string, $borders=true){
            $reg="!".preg_quote($start)."(.*?)".preg_quote($end)."!is";
            preg_match_all($reg,$string,$matches);

            if($borders) return $matches[0];    
            else return $matches[1];    
        }

функция вернет совпадающие блоки в массиве.

$array = search("<script>" , "</script>" , $html)

как только вы удалите скрипт и стили, используйте strip_tags, чтобы получить текст

0 голосов
/ 02 октября 2009

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

...