2011-04-19 18 views
6

que tengo un enorme código HTML en una variable PHP como:PHP: muestra los primeros 500 caracteres de HTML

$html_code = '<div class="contianer" style="text-align:center;">The Sameple text.</div><br><span>Another sample text.</span>....'; 

Quiero mostrar sólo los primeros 500 caracteres de este código. Este recuento de caracteres debe considerar el texto en las etiquetas HTML y debe excluir las etiquetas HTMl y los atributos al medir la longitud. pero al recortar el código, no debería afectar la estructura DOM del código HTML.

¿Hay algún tutorial o ejemplos de trabajo disponibles?

+0

¿Desea que el texto se cuente sin html, pero luego se devuelve envuelto en el html original? –

+0

sí. Quiero que se devuelva envuelto en html para que pueda mostrarlo en una página. – Vin

+0

He agregado un poco de Pseudo a mi respuesta anterior, espero que pueda apuntar en la dirección correcta. Realmente lo siento, no tengo tiempo para trabajar en hacer las cosas bien, pero cruzar los dedos te hará superar el obstáculo. ¡Publica tu respuesta si encuentras la solución! Me encantaría ver –

Respuesta

3

Ooohh ... Sé que esto no puedo obtener exactamente la parte superior de mi cabeza, pero que desea cargar el texto que tiene como DomDocument

http://www.php.net/manual/en/class.domdocument.php

y luego agarre la texto del nodo del documento completo (como un DOMnode http://www.php.net/manual/en/class.domnode.php)

Esto no será exactamente correcto, pero con suerte esto lo guiará por el camino correcto. Pruebe algo como:

$html_code = '<div class="contianer" style="text-align:center;">The Sameple text.</div><br><span>Another sample text.</span>....'; 
$dom = new DOMDocument(); 
$dom->loadHTML($html_code); 
$text_to_strip = $dom->textContent; 
$stripped = mb_substr($text_to_strip,0,500); 
echo "$stripped"; // The Sameple text.Another sample text..... 

edición bien ... eso debería funcionar. Sólo probado localmente

Edit2

Ahora que entiendo que desea conservar las etiquetas, pero limitar el texto, vamos a ver. Tendrá que repetir el contenido hasta que llegue a 500 caracteres. Es probable que esto requiera algunas ediciones y pases para que pueda hacerlo bien, pero espero poder ayudarlo. (Lo siento, no puedo darle toda la atención)

El primer caso es cuando el texto tiene menos de 500 caracteres. Nada de que preocuparse. Comenzando con el código anterior, podemos hacer lo siguiente.

if (strlen($stripped) > 500) { 
     // this is where we do our work. 

     $characters_so_far = 0; 
     foreach ($dom->child_nodes as $ChildNode) { 

      // should check if $ChildNode->hasChildNodes(); 
      // probably put some of this stuff into a function 
      $characters_in_next_node += str_len($ChildNode->textcontent); 
      if ($characters_so_far+$characters_in_next_node > 500) { 
       // remove the node 
       // try using 
       // $ChildNode->parentNode->removeChild($ChildNode); 
      } 
      $characters_so_far += $characters_in_next_node 
     } 
     // 
     $final_out = $dom->saveHTML(); 
    } else { 
     $final_out = $html_code; 
    } 
+0

'textContent' es una propiedad. Además, ¿no tendrá esto todo el HTML eliminado? – alex

4

Si el texto que desea, usted puede hacer esto con el siguiente también

substr(strip_tags($html_code),0,500); 
+0

necesito la cadena de salida en formato html.so que puedo mostrarlo en una página HTML. – Vin

1

No estoy hasta la codificación de una solución real, pero si alguien quiere, esto es lo lo haría (en pseudo-PHP):

$html_code = '<div class="contianer" style="text-align:center;">The Sameple text.</div><br><span>Another sample text.</span>....'; 
$aggregate = ''; 

$document = XMLParser($html_code); 

foreach ($document->getElementsByTagName('*') as $element) { 
    $aggregate .= $element->text(); // This is the text, not HTML. It doesn't 
            // include the children, only the text 
            // directly in the tag. 
} 
2

estoy pegando a continuación una clase PHP que escribí hace un tiempo largo , pero yo sé que funciona. no es exactamente lo que buscas, ya que se trata de palabras en lugar de un recuento de personajes, pero creo que es bastante cercano y que a alguien le puede resultar útil.

class HtmlWordManipulator 
    { 
    var $stack = array(); 

    function truncate($text, $num=50) 
    { 
     if (preg_match_all('/\s+/', $text, $junk) <= $num) return $text; 
     $text = preg_replace_callback('/(<\/?[^>]+\s+[^>]*>)/','_truncateProtect', $text); 
     $words = 0; 
     $out = array(); 
     $text = str_replace('<',' <',str_replace('>','> ',$text)); 
     $toks = preg_split('/\s+/', $text); 
     foreach ($toks as $tok) 
     { 
     if (preg_match_all('/<(\/?[^\x01>]+)([^>]*)>/',$tok,$matches,PREG_SET_ORDER)) 
      foreach ($matches as $tag) $this->_recordTag($tag[1], $tag[2]); 
     $out[] = trim($tok); 
     if (! preg_match('/^(<[^>]+>)+$/', $tok)) 
     { 
      if (!strpos($tok,'=') && !strpos($tok,'<') && strlen(trim(strip_tags($tok))) > 0) 
      { 
      ++$words; 
      } 
      else 
      {     
      /* 
      echo '<hr />'; 
      echo htmlentities('failed: '.$tok).'<br /)>'; 
      echo htmlentities('has equals: '.strpos($tok,'=')).'<br />'; 
      echo htmlentities('has greater than: '.strpos($tok,'<')).'<br />'; 
      echo htmlentities('strip tags: '.strip_tags($tok)).'<br />'; 
      echo str_word_count($text); 
      */ 
      } 
     } 
     if ($words > $num) break; 
     } 
     $truncate = $this->_truncateRestore(implode(' ', $out)); 
     return $truncate; 
    } 

    function restoreTags($text) 
    { 
     foreach ($this->stack as $tag) $text .= "</$tag>"; 
     return $text; 
    } 

    private function _truncateProtect($match) 
    { 
     return preg_replace('/\s/', "\x01", $match[0]); 
    } 

    private function _truncateRestore($strings) 
    { 
     return preg_replace('/\x01/', ' ', $strings); 
    } 

    private function _recordTag($tag, $args) 
    { 
     // XHTML 
     if (strlen($args) and $args[strlen($args) - 1] == '/') return; 
     else if ($tag[0] == '/') 
     { 
     $tag = substr($tag, 1); 
     for ($i=count($this->stack) -1; $i >= 0; $i--) { 
     if ($this->stack[$i] == $tag) { 
      array_splice($this->stack, $i, 1); 
      return; 
     } 
     } 
     return; 
     } 
     else if (in_array($tag, array('p', 'li', 'ul', 'ol', 'div', 'span', 'a'))) 
     $this->stack[] = $tag; 
     else return; 
    } 
    } 

truncado es lo que quiere, y se le pasa el html y el número de palabras que desea que recorta a. ignora html mientras cuenta las palabras, pero luego vuelve a envolver todo en html, incluso al cerrar las etiquetas finales debido al truncamiento.

por favor no me juzguen sobre la falta total de principios oop. Era joven y estúpido.

edición:

por lo que resulta el uso es de la misma familia:

$content = $manipulator->restoreTags($manipulator->truncate($myHtml,$numOfWords)); 

estúpida decisión de diseño. Sin embargo, me permitió inyectar html dentro de las etiquetas sin cerrar.

Cuestiones relacionadas