Как читать CDATA из тегов HTML - PullRequest
3 голосов
/ 01 января 2012

Ниже приведена функция в php, которая принимает любую строку (строка также будет содержать html-теги) и возвращает всего несколько слов из того, что указано в переменной $ min.

function gen_string($string,$min=500,$clean=true) {

    $text = trim(strip_tags($string));

        if(strlen($text)>$min) {
            $blank = strpos($text,' ');
            if($blank) {
                # limit plus last word
                $extra = strpos(substr($text,$min),' ');
                $max = $min+$extra;
                $r = substr($text,0,$max);
                $query = "select distinct ID from cms_content";
                $result = mysql_query($query);
                $IDlink = 'http://localhost/www/index.php?ID='.$result;
                    if(strlen($text)>=$max && !$clean) $r=trim($r,'.') ;

            } else {
                # if there are no spaces
                $r = substr($text,0,$min).'.........';
            }

        } else {
            # if original length is lower than limit
            $r = $text;
        }
        return trim($r);
}

Но проблема в том, что в возвращаемой строке он не читает теги html. Итак, как заставить эту функцию читать теги html, чтобы возвращаемая строка была в отформатированных тегах html?

Ответы [ 2 ]

0 голосов
/ 01 января 2012

Используйте tidy , чтобы создать действительную (x) строку HTML, проанализируйте ее в DOM-документе , затем используйте XPath (не проверено) //body//text().

Я указал вам правильные функции / методы класса, чтобы вы могли приступить к работе.

Документация и примечания пользователя могут быть особенно полезны для вас.

POC:

 1  <?php
 2  $string = '<p>Hello <b>World <i>out</i><span>there</span></b></p>';
 3  
 4  $string = tidy_repair_string($string);
 5  
 6  $doc = new DOMDocument;
 7  $doc->loadHTML($string);
 8  
 9  $path = new DOMXPath($doc);
10  
11  $entries = $path->query('//body//text()');
12  
13  $string = NULL;
14  
15  foreach($entries as $entry) {
16      if(preg_match('/\w/', $entry->nodeValue)) {
17          $string .= $entry->nodeValue;
18      }
19  }
20  echo $string;

Выход: Hello World outthere.

0 голосов
/ 01 января 2012

Ваша проблема заключается в следующем:

$text = trim(strip_tags($string));

strip_tags удалит все теги, поэтому функция не сможет их вернуть.

Поскольку вы вырезаете части строки, вы получите недопустимые фрагменты HTML. Вам нужно либо tidy, либо HTMLPurifier, чтобы исправить это позже.

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