9
votes

Compter les mots sur une page Web HTML en utilisant php

J'ai besoin d'un script PHP qui prend une URL d'une page Web puis échelle combien de fois un mot est mentionné.

Exemple

Il s'agit d'une page HTML générique: xxx

Ce sera le script php: xxx

donc la sortie être une table comme celle-ci: xxx

C'est quelque chose comme les robots de recherche font quand ils surfent sur le Web, donc toute idée de la façon de commencer, voire mieux, faire Vous avez un script PHP qui le fait déjà?


0 commentaires

5 Réponses :


30
votes

La ligne ci-dessous effectuera un nombre de mots insensibles de cas après avoir désentré toutes les balises HTML de votre chaîne.

Exemple en direct xxx

pour saisir le code source d'une page que vous pouvez utiliser CURL ou file_get_contents () xxx

de l'intérieur:

  1. Utilisez strtoolower () pour tout faire minuscule.
  2. STAND STAND Tags HTML à l'aide de strip_tags ()
  3. Créez un tableau de mots utilisés à l'aide de str_word_count () < / strong> . L'argument 1 renvoie un tableau contenant tous les mots trouvés à l'intérieur de la chaîne.
  4. Utilisez array_count_values ​​() < / a> Pour capturer des mots utilisés plus d'une fois en comptant la survenue de chaque valeur dans votre éventail de mots.
  5. Utilisez print_r () à Afficher les résultats.

2 commentaires

Eh bien ouais, mais comment "Bout script et style tags?


@YI JIANG - Si vous voulez traiter avec ceux-ci séparément, de nombreux analyseurs HTML existent déjà. Il ne sert à rien de réécrire, car ils sont des bêtes difficiles et compliquées.



0
votes

Le code précédent est un point où commence. La prochaine étape consiste à supprimer des balises HTML avec les expressions régulières. Recherchez des fonctions EREG et EREGI. Certaines autres astuces sont nécessaires pour les étiquettes de style et de script (vous devez supprimer le contenu) Les points et les virgules doivent être enlevés aussi ...


4 commentaires

EREG a été obsolète et, pour commencer, les regexes ne sont pas un outil adéquat pour analyser HTML arbitraire.


Comment l'expression régulière peut-elle être obsolète si elles existent de Perl O.O?


Les réponses ne sont pas toujours répertoriées dans l'ordre chronologique. SO Code précédent n'est pas très utile. Un lien URL (chaque réponse a une référence unique) ou une référence auteur est meilleure.


Les expressions régulières n'ont pas été obsolètes, seule l'extension Ereg. Utilisez PCRE à la place (la famille PREG _ Fonction).



5
votes

Le script ci-dessous lira le contenu de l'URL distante, supprimez les balises HTML et comptera les occurrences de chaque mot unique dans celui-ci.

CAVEAT: dans votre sortie attendue, "Ceci" a une valeur de 2, mais Le ci-dessous est sensible à la casse, donc "ceci" et "ceci" sont enregistrés comme des mots distincts. Vous COUDL convertissez la chaîne d'entrée entière en minuscules avant le traitement si le boîtier d'origine n'est pas significatif à vos fonctions. P>

En outre, comme seuls une bande de base est exécutée sur l'entrée, des étiquettes de forme mal formée ne seront pas. supprimé, donc l'hypothèse est que votre source HTML est valide. p>

EDIT: STRAND> Charlie souligne dans les commentaires comme la section code> la tête code> Être compté. A l'aide d'une fonction définie dans le Notes d'utilisateur de la bande_Tags Fonction , celles-ci sont également maintenant prises en charge. p>

genichtml.com strong> p> xxx pré>

parseur .php strong> p> xxx pré>

?> p>

Sortie: strong> p>

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


4 commentaires

Il s'agit d'une solution propre mais de style et d'étiquette de script existe toujours. Que toute la tête de la page doit être supprimée.


Si vous utilisez le code HTML non valide non valide, vous pouvez être analysé;) La ponctuation est toujours un problème


Veuillez ne pas analyser HTML avec des expressions régulières.


BTW, Strip_Tags () (que vous utilisez) Supprime déjà des commentaires HTML multi-lignes et CDATA - CODEPAD.ORG/GPDDEN0T php.net/manual/fr/funcund.strip-tags.php.



-1
votes

Ceci est un travail complexe que vous ne devriez pas tenter votre propre.

Vous devez extraire du texte qui ne fait pas partie des balises / commentaires et n'est pas un enfant pour des éléments tels que script et style . Pour cela, vous aurez également besoin d'un analyseur LAX HTML (comme celui implémenté dans LibXML2 et utilisé dans Domdocument .

Ensuite, vous devez Tokenize Le texte, qui présente ses propres défis. Enfin, vous vous êtes intéressé par une forme de stemming avant de procéder à compter les termes.

Je vous recommande d'utiliser des outils spécialisés pour cela. Je n'ai utilisé aucun de ceux-ci, mais vous pouvez essayer HTMLParser pour analyse et Lucene pour la tokénisation / stemming (le but de Lucene est Récupération de texte , mais ces opérations sont nécessaires pour la construction de l'index).


5 commentaires

Un travail complexe? Le code Conroyp fonctionne bien et fait une grande partie de ce que vous avez énuméré. HTML a une syntaxe très régulière


@Charlie Il y a tellement de choses qui manquent ... Traitement des codages qui ne sont pas ASCII, une manipulation correcte de HTML (je pourrais facilement construire un document HTML avec une transcription biblique qui ne lui donnerait aucun mot pour son code), un bon Tokenizer ( Str_Word_Count est très basique et ne gère que ASCII), une timbolique, ...


Une timmer? Fist Pourquoi ajouter une timmer qui ne pourra pas trouver les racines de toutes les langues? (Quel est le but? La question initiale a demandé un simple analyseur HTML, pas un analyseur de langue)


Vous pouvez Trouver Stemmers pour plusieurs langues. L'OP ne dit pas qu'il veut stemming, mais il est légitime de supposer qu'il veut, espèce, car il y a déjà une forme de normalisation à terme dans sa question ("ceci" et "ceci" sont comptés comme les mêmes). Et je suppose que vous concédez les autres points ...


Oui, mes doutes sont toujours sur la timmer. Vous l'italien sur la liste que vous avez signalé ne correspond pas correctement à 30% des mots italiens et le vocabulaire qu'il contient n'est que 1% des mots italiens (je ne plaisante pas). Martin Porter a écrit un algorithme bien pour l'anglais (peut-être) mais pas bon pour d'autres langues plus complexes.



0
votes

C'est mon code pour compter des mots contenant des balises HTML: xxx

  • Step1: Convertissez tout NBSP en espace
  • Step2: correction des balises HTML cassées (si elle n'est pas une fonction de striptags fixe cassé une chaîne)
  • Step3: Strip Tags HTML
  • Step4 & 5 & 6: Effacer les espaces cachés cachés et la nouvelle ligne / onglets
  • Step7: Trim Début et fin de la chaîne
  • Step8: Convertissez chaque mot en tableau
  • Step9: Tableau filtré à compter

0 commentaires