solo regulares regular probar preg_match_all patrones letras expresiones expresion espacios ejemplos php html scripting bots

regulares - Contando palabras en una página web html usando php



preg_match_all ejemplos php (5)

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

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:

<html> <body> <h1> This is the title </h1> <p> some description text here, <b>this</b> is a word. </p> </body> </html>

Esta será la secuencia de comandos PHP:

<?php htmlurl="generichtml.com"; the script here echo(result); ?>

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?


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

$sayilacak_metin = str_replace("&nbsp;", " ", $sayilacak_metin); $sayilacak_metin = preg_replace("/<([^>]*(<|$))/", "&lt;$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 etiquetas html rotas (si no está fija, la función striptags romperá la cadena)
  • Paso 3: etiquetas Strip html
  • Paso 4, 5 y 6: borrar espacios en blanco ocultos y nuevas líneas / pestañas
  • 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 etiquetas / 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).


La siguiente línea hará un recuento de palabras insensible a mayúsculas y minúsculas después de eliminar todas las etiquetas 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 etiquetas 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 etiquetas 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 etiquetas 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

<html> <body> <h1> This is the title </h1> <p> some description text here, <b>this</b> is a word. </p> </body> </html>

parser.php

// Fetch remote html $contents = file_get_contents($htmlurl); // Get rid of style, script etc $search = array(''@<script[^>]*?>.*?</script>@si'', // Strip out javascript ''@<head>.*?</head>@siU'', // Lose the head section ''@<style[^>]*?>.*?</style>@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 )