2010-12-22 4 views
2

J'ai un programme PHP qui, à un moment donné, doit analyser une grande quantité de texte HTML + javascript pour analyser les informations. Tout ce que je veux analyser doit être en deux parties.Amélioration d'une instruction regex pour être aussi efficace que possible

  1. tous "HTML Seperate goupes" pour analyser
  2. Parse chaque groupe HTML pour obtenir les informations nécessaires.

Au 1er Parse il doit trouver:

<div id="myHome" 

Et commencer la capture après cette balise. Puis arrêtez la capture avant

<span id="nReaders" 

Et de capturer le numéro qui vient après cette balise et d'arrêter.

Dans la 2ème analyse, la capture nº 1 (0 a le tout et 2 le numéro) de l'analyse effectuée précédemment, puis trouve . J'ai déjà un code pour le faire et cela fonctionne. Y a-t-il un moyen d'améliorer cela, de faciliter l'analyse de la machine?

preg_match_all('%<div id="myHome"[^>]>(.*?)<span id="nReaders[^>]>([0-9]+)<"%msi', $data, $results, PREG_SET_ORDER); 
foreach($results AS $result){ 
    preg_match_all('%<div class="myplacement".*?[.]php[?]((?:next|before))=([0-9]+).*?<tbody.*?<td[^>]>.*?[0-9]+"%msi', $result[1], $mydata, PREG_SET_ORDER); 
//takes care of the data and finish the program 

Note: Je en ai besoin pour un programme freeware donc il doit être aussi générale que possible et, si possible, ne pas utiliser des extensions php

ADD: J'omises quelques pièces ici parce que je ne l'ai pas attendre des réponses comme celles-ci. Il est également nécessaire d'analyser le texte à l'intérieur d'une des balises du document. Ce peut être la 6ème 7ème ou 8ème étiquette mais je sais que c'est après une certaine étiquette. L'analyseur que j'ai vérifié (thx profitphp) fonctionne pour trouver l'étiquette de script. Et maintenant? Il y a plus d'une étiquette avec la même classe. Je les veux tous. Mais je veux seulement avec aussi une d'une liste de classes ..... Où puis-je trouver des instructions et des démos et des limites de parseurs DOM (comme celui de http://simplehtmldom.sourceforge.net/)? J'ai besoin de quelque chose qui fonctionnera, au moins, une grande quantité de serveurs gratuits. Une autre chose. Comment analyser cette partie: "php? = ([0-9] +)" avec ces analyseurs HTML?

+6

Le problème semble mieux adapté à un analyseur [html] (http://stackoverflow.com/questions/292926/robust-mature-html-parser-for-php). Voir les [réponses ici] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) qui expliquent pourquoi. – marcog

+4

En règle générale, [ne pas utiliser regex pour analyser HTML] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454). – lonesomeday

+2

euh, le fil quotidien "comment abus regex pour html parsing". – cbrandolino

Répondre

1

Comme noté ci-dessus, regex n'est pas un bon ajustement pour cela. Vous serez mieux d'utiliser somethign comme ceci:

Robust and Mature HTML Parser for PHP

+0

L'analyseur html qui apparaît ici semble utile et semble fonctionner avec une partie de mon regex. Qu'en est-il du code d'analyse écrit à l'intérieur des balises ? – brunoais

3

Si vous êtes préoccupé par l'efficacité (et même précision), don't attempt to parse HTML using regex.

Vous devez utiliser un analyseur, comme DOM PHP

+0

En utilisant le code que j'ai fait, il n'y a pas de problèmes de précision. Quoi qu'il en soit, je vais essayer de voir cette extension php. Comme c'est pour un programme, il devrait fonctionner avec autant de serveurs que possible – brunoais

+0

@ user551625 - Fine. N'hésitez pas à mettre à jour cette question chaque fois que vous trouvez des fichiers qui ne fonctionnent pas. –

0

l'efficacité n'a pas d'importance si vos résultats sont incorrects. Analyser HTML avec des expressions régulières conduira à des résultats incorrects sur la route. Utilisez un analyseur.

+0

Selon la manière dont les pages seront analysées, elles n'échoueront jamais. – brunoais

+0

Existe-t-il un analyseur HTML pour php que je peux utiliser pour trouver ce que je veux de cette façon (je ne connais pas d'autre algorithme pour trouver l'information)? Si oui, où puis-je le trouver? Je dois aussi travailler à côté d'un tag de script – brunoais

0

J'ai trouvé un moyen de créer des recherches efficaces.

Si vous souhaitez rechercher « Une énorme chaîne dans un texte entier », vous pouvez le faire de cette façon:

(?:(?:[^A]*A)+? huge string in a whole text) 

Il fonctionne toujours.Crée uniquement un backtrace tous les caractères 'A' et non pour chaque caractère. Pour cette raison, il n'est pas seulement efficace sur le plan de la mémoire, mais également efficace en termes de puissance de traitement. S'il y a deux options, cela fonctionne également sans problème:

(?:(?:[^AB]*AB)+?(?: huge string in a whole text|e the huge string in a whole text)) 

Jusqu'à présent, il n'a jamais échoué.

Questions connexes