Contando palabras en una página web html usando php

Necesito un script PHP que toma una URL de una página web y luego repite cuántas veces se menciona una palabra.

Ejemplo

Esta es una página HTML genérica:

  

This is the title

some description text here, this is a word.

Esta será la secuencia de comandos PHP:

  

Entonces la salida será una tabla como esta:

 WORDS Mentions This 2 is 2 the 1 title 1 some 1 description 1 text 1 a 1 word 1 

Esto es algo parecido a lo que hacen los bots de búsqueda cuando navegan por la web, entonces, ¿alguna idea de cómo comenzar o, mejor aún, tener un script PHP que ya lo haga?

La siguiente línea hará un recuento de palabras insensible a mayúsculas y minúsculas después de eliminar todas las tags HTML de la cadena.

Ejemplo en vivo

 print_r(array_count_values(str_word_count(strip_tags(strtolower($str)), 1))); 

Para tomar el código fuente de una página, puede usar cURL o file_get_contents ()

 $str = file_get_contents('http://www.example.com/'); 

De adentro hacia afuera:

  1. Use strtolower () para hacer todo en minúsculas.
  2. Pele las tags HTML usando strip_tags ()
  3. Crea una matriz de palabras usadas usando str_word_count () . El argumento 1 devuelve una matriz que contiene todas las palabras encontradas dentro de la cadena.
  4. Use array_count_values ​​() para capturar palabras usadas más de una vez al contar la ocurrencia de cada valor en su matriz de palabras.
  5. Use print_r () para mostrar los resultados.

La siguiente secuencia de comandos leerá el contenido de la URL remota, eliminará las tags html y contará las ocurrencias de cada palabra única en la misma.

Advertencia: en su salida esperada, “Esto” tiene un valor de 2, pero el siguiente es sensible a mayúsculas y minúsculas, por lo que tanto “esto” como “Esto” se registran como palabras separadas. Puede convertir toda la cadena de entrada en minúsculas antes de procesar si la caja original no es significativa para sus propósitos.

Además, como solo se ejecuta un strip_tags básico en la entrada, las tags malformadas no se eliminarán, por lo que se supone que el html de origen es válido.

Editar: Charlie señala en los comentarios que cosas como la sección de la head todavía se contarán. Con la ayuda de una función definida en las notas de usuario de la función strip_tags , ahora también se tienen en cuenta.

generichtml.com

   

This is the title

some description text here, this is a word.

parser.php

 // Fetch remote html $contents = file_get_contents($htmlurl); // Get rid of style, script etc $search = array('@@si', // Strip out javascript '@.*?@siU', // Lose the head section '@@siU', // Strip style tags properly '@< ![\s\S]*?--[ \t\n\r]*>@' // Strip multi-line comments including CDATA ); $contents = preg_replace($search, '', $contents); $result = array_count_values( str_word_count( strip_tags($contents), 1 ) ); print_r($result); 

?>

Salida:

 Array ( [This] => 1 [is] => 2 [the] => 1 [title] => 1 [some] => 1 [description] => 1 [text] => 1 [here] => 1 [this] => 1 [a] => 1 [word] => 1 ) 

El código anterior es un punto donde comenzar. El siguiente paso es eliminar tags html con las expresiones regulares. Busque las funciones ereg y eregi. Se requieren algunos otros trucos para las tags de estilo y guión (debe eliminar el contenido). Los puntos y las comas también deben eliminarse …

Ese es mi código para contar palabras que contienen tags html:

 $sayilacak_metin = str_replace(" ", " ", $sayilacak_metin); $sayilacak_metin = preg_replace("/< ([^>]*(< |$))/", "<$1", $sayilacak_metin); $sayilacak_metin = strip_tags($sayilacak_metin); $sayilacak_metin = str_replace(chr(194)," ",$sayilacak_metin); $sayilacak_metin = str_replace(chr(160)," ",$sayilacak_metin); $sayilacak_metin = preg_replace(array('/\s{2,}/', '/[\r\t\n]/','/\r/','/\t/','/\n/'), ' ', $sayilacak_metin); $sayilacak_metin=trim($sayilacak_metin); $parca = explode(" ", $sayilacak_metin); $sonuc=count(array_filter($parca)); 
  • Paso 1: Convierta todos los nbsp al espacio
  • Paso 2: Repare las tags html rotas (si no está fija, la función striptags romperá la cadena)
  • Paso 3: tags Strip html
  • Paso 4, 5 y 6: borrar espacios en blanco ocultos y nuevas líneas / tabs
  • Paso 7: recortar el comienzo y el final de la cadena
  • Paso 8: convierte cada palabra en matriz
  • Paso9: cuenta la matriz filtrada

Este es un trabajo complejo que no debe intentar por su cuenta.

Debe extraer texto que no forme parte de tags / comentarios y que no sea un elemento secundario para elementos como el script y el style . Para esto, también necesitará un analizador HTML laxo (como el implementado en libxml2 y utilizado en DOMDocument .

Luego debe tokenizar el texto, que presenta sus propios desafíos. Finalmente, le interesaría alguna forma de derivación antes de proceder a contar los términos.

Te recomiendo que uses herramientas especializadas para esto. No he usado ninguno de estos, pero puedes probar HTMLParser para el análisis y Lucene para tokenización / stemming (el propósito de Lucene es la recuperación de texto , pero esas operaciones son necesarias para construir el índice).