2011-02-27 8 views
0

함수가 정확하지 이행합니다, 스크립트는 깨끗한 텍스트를 가져해야하지만,이 경우, 그는 텍스트와모든 태그를 제거하는 방법?

사이트 입력 사이트에서 불필요한 정보를 많이 취 http://lita.ru/health/doctor/

스크립트 지수 :

<?php 

include("strip_tags_smart.php"); 
include("UTF8.php"); 
include("ReflectionTypehint.php"); 

/* Read an HTML file */ 
if(isset($_POST['urls'])){ 
    include 'connect.php'; 

    $urls = explode("\r\n", $_POST['urls']); 
    for ($i = 0; $i < sizeof($urls); $i++) 
    { 
     $url = $urls[$i]; 
     echo $url."</br>"; 
     $text = file_get_utf8_contents($url); 
     $titre = eregi("<title>(.*)</title>",$text,$regs); 
     $title = $regs[1]; 
     echo $title."</br>"; 
     $text = strip_tags_smart($text); 
     echo mysql_escape_string($url)."</br>title = "; 
     echo mysql_escape_string($title)."</br>text="; 
     echo mysql_escape_string($text)."</br>"; 
     echo "</br>".$query; 

    } 


} 
function file_get_utf8_contents($fn) { 

    $raw_text = file_get_contents($fn); 

    $raw_text = strtolower($raw_text); 


    if(UTF8::is_utf8($raw_text)) 
    { 


     $raw_text = UTF8::convert_from($raw_text, 'utf8'); 

    } 
    else 
    { 

     $raw_text = UTF8::convert_from($raw_text, 'cp1251'); 

     } 

    return $raw_text; 
} 
?> 
<form action="<?php $_PHP_SELF ?>" method="POST"> 
urls:</br> 
<textarea rows="30" cols="100" wrap="physical" name="urls"> 

</textarea> 

    <input type="submit" value="Submit" /> 
</form> 

sript의 UTF8 : http://rapidshare.com/files/450118274/utf8.php

스크립트 strip_tags_smart :

<?php 
function strip_tags_smart(
    /*string*/ $s, 
    array $allowable_tags = null, 
    /*boolean*/ $is_format_spaces = true, 

    array $pair_tags = array('head', 'SCRIPT', 'script', 'style', 'map', 'iframe', 'frameset', 'object', 'applet', 'comment', 'button', 'textarea', 'select', 'img', 'form', 'noindex','noembed', 'applet'), 
    array $para_tags = array('p', 'td', 'th','address','blockquote','center','div','fieldset','isindex','menu','ol','table', 'ul', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'form', 'title', 'pre') 
) 
{ 
    //$vowels = array("#","(",")","\""); 
    //$s = str_replace($vowels, " ", $s); 
    //echo $s; 
    //echo "</br>-----------------------------------------------------------------</br>"; 

    //return strip_tags($s); 
    static $_callback_type = false; 
    static $_allowable_tags = array(); 
    static $_para_tags  = array(); 
    #regular expression for tag attributes 
    #correct processes dirty and broken HTML in a singlebyte or multibyte UTF-8 charset! 
    static $re_attrs_fast_safe = '(?![a-zA-Z\d]) #statement, which follows after a tag 
            #correct attributes 
            (?> 
             [^>"\']+ 
            | (?<=[\=\x20\r\n\t]|\xc2\xa0) "[^"]*" 
            | (?<=[\=\x20\r\n\t]|\xc2\xa0) \'[^\']*\' 
            )* 
            #incorrect attributes 
            [^>]*+'; 

    if (is_array($s)) 
    { 
     if ($_callback_type === 'strip_tags') 
     { 
      $tag = strtolower($s[1]); 
      if ($_allowable_tags) 
      { 
       #tag with attributes 
       if (array_key_exists($tag, $_allowable_tags)) return $s[0]; 

       #tag without attributes 
       if (array_key_exists('<' . $tag . '>', $_allowable_tags)) 
       { 
        if (substr($s[0], 0, 2) === '</') return '</' . $tag . '>'; 
        if (substr($s[0], -2) === '/>') return '<' . $tag . ' />'; 
        return '<' . $tag . '>'; 
       } 
      } 
      if ($tag === 'br') return "\r\n"; 
      if ($_para_tags && array_key_exists($tag, $_para_tags)) return "\r\n\r\n"; 
      return ''; 
     } 
     trigger_error('Unknown callback type "' . $_callback_type . '"!', E_USER_ERROR); 
    } 

    if (($pos = strpos($s, '<')) === false || strpos($s, '>', $pos) === false) #speed improve 
    { 
     #tags are not found 
     return $s; 
    } 

    $length = strlen($s); 

    #unpaired tags (opening, closing, !DOCTYPE, MS Word namespace) 
    $re_tags = '~ <[/!]?+ 
        (
         [a-zA-Z][a-zA-Z\d]*+ 
         (?>:[a-zA-Z][a-zA-Z\d]*+)? 
        ) #1 
        ' . $re_attrs_fast_safe . ' 
        > 
       ~sxSX'; 

    $patterns = array(
     '/<([\?\%]) .*? \\1>/sxSX',  #встроенный PHP, Perl, ASP код 
     '/<\!\[CDATA\[ .*? \]\]>/sxSX', #блоки CDATA 
     #'/<\!\[ [\x20\r\n\t]* [a-zA-Z] .*? \]>/sxSX', #:DEPRECATED: MS Word таги типа <![if! vml]>...<![endif]> 

     '/<\!--.*?-->/sSX', #комментарии 

     #MS Word таги типа "<![if! vml]>...<![endif]>", 
     #условное выполнение кода для IE типа z"<!--[if expression]> HTML <![endif]-->" 
     #условное выполнение кода для IE типа "<![if expression]> HTML <![endif]>" 
     #см. http://www.tigir.com/comments.htm 
     '/ <\! (?:--)?+ 
       \[ 
       (?> [^\]"\']+ | "[^"]*" | \'[^\']*\')* 
       \] 
       (?:--)?+ 
      > 
     /sxSX', 
    ); 
    if ($pair_tags) 
    { 
     #парные таги вместе с содержимым: 
     foreach ($pair_tags as $k => $v) $pair_tags[$k] = preg_quote($v, '/'); 
     $patterns[] = '/ <((?i:' . implode('|', $pair_tags) . '))' . $re_attrs_fast_safe . '(?<!\/)> 
         .*? 
         <\/(?i:\\1)' . $re_attrs_fast_safe . '> 
         /sxSX'; 
    } 
    #d($patterns); 

    $i = 0; #защита от зацикливания 
    $max = 99; 
    while ($i < $max) 
    { 
     $s2 = preg_replace($patterns, '', $s); 
     if (preg_last_error() !== PREG_NO_ERROR) 
     { 
      $i = 999; 
      break; 
     } 

     if ($i == 0) 
     { 
      $is_html = ($s2 != $s || preg_match($re_tags, $s2)); 
      if (preg_last_error() !== PREG_NO_ERROR) 
      { 
       $i = 999; 
       break; 
      } 
      if ($is_html) 
      { 
       if ($is_format_spaces) 
       { 
        /* 
        В библиотеке PCRE для PHP \s - это любой пробельный символ, а именно класс символов [\x09\x0a\x0c\x0d\x20\xa0] или, по другому, [\t\n\f\r \xa0] 
        Если \s используется с модификатором /u, то \s трактуется как [\x09\x0a\x0c\x0d\x20] 
        Браузер не делает различия между пробельными символами, друг за другом подряд идущие символы воспринимаются как один 
        */ 
        $s2 = str_replace(array("\r", "\n", "\r\n", "\t"), ' ', $s2); 
        $s2 = strtr($s2, "\x09\x0a\x0c\x0d", ' '); 
        $s2 = preg_replace('/ [\x09\x0a\x0c\x0d]++ 
             | <((?i:pre|textarea))' . $re_attrs_fast_safe . '(?<!\/)> 
              .+? 
              <\/(?i:\\1)' . $re_attrs_fast_safe . '> 
              \K 
             /sxSX', ' ', $s2); 
        if (preg_last_error() !== PREG_NO_ERROR) 
        { 
         $i = 999; 
         break; 
        } 
       } 

       #массив тагов, которые не будут вырезаны 
       if ($allowable_tags) $_allowable_tags = array_flip($allowable_tags); 

       #парные таги, которые будут восприниматься как параграфы 
       if ($para_tags) $_para_tags = array_flip($para_tags); 
      } 
     }#if 

     #tags processing 
     if ($is_html) 
     { 
      $_callback_type = 'strip_tags'; 
      $s2 = preg_replace_callback($re_tags, __FUNCTION__, $s2); 
      $_callback_type = false; 
      if (preg_last_error() !== PREG_NO_ERROR) 
      { 
       $i = 999; 
       break; 
      } 
     } 

     if ($s === $s2) break; 
     $s = $s2; $i++; 
    }#while 
    if ($i >= $max) $s = strip_tags($s); #too many cycles for replace... 

    if ($is_format_spaces && strlen($s) !== $length) 
    { 
     #remove a duplicate spaces 
     $s = preg_replace('/\x20\x20++/sSX', ' ', trim($s)); 

     $s = preg_replace(
     array(
      // Remove invisible content 
      '@\r\[email protected]', 
      '@[#&].{3,5};@siu', 
      '@[&][email protected]', 
      '@[`~\@\#\$\%^\&*()=+{}[\]"\'\\|/<>]@siu', 

     ), 
     array(
      ' ', ' ', 
     ), 
     $s); 
//, 


     #remove a spaces before and after new lines 
     $s = str_replace(array("\r\n\x20", "\x20\r\n"), "\r\n", $s); 
     #replace 3 and more new lines to 2 new lines 
     $s = preg_replace('/[\r\n]{3,}+/sSX', "\r\n\r\n", $s); 


    } 
    return $s; 

나는 브라우저 } 에 사람을보고 그냥 텍스트를 떠나 모든 태그를 제거해야>

답변

2

PHP의 strip_tags() - 함수는 UTF-8 문자열을 처리 할 수 ​​있어야한다. 그것은 나에게 보인다, 문제는 원본 사이트 HTML을 구문 분석하여 관심있는 부분을 얻는 것입니다. 예제 사이트 (http://lita.ru/health/doctor/)에 포함되지 않았기 때문에 매우 어려울 수 있습니다. HTML 유효성 검사. 또한 저작권과 관련하여 제 3 자 콘텐츠를 복사하는 것에 대해서도 유의하십시오.

+0

이 주 문제는 유효하지 않은 HTML로 간주되어야합니다. – Mediator

관련 문제