2010-06-13 5 views
1

J'ai besoin d'extraire un Id spécifique d'un document html mais le problème est que l'identifiant ne doit pas être "utilisé".php motif preg_match pour extraire une information spécifique, regex

Voici le contenu html http://pastebin.com/wF2dx8JZ

Comme vous pouvez le voir, il y a différents blocs html. Certains d'entre eux contiennent le mot "Utilisé", je n'ai donc besoin d'extraire que le premier identifiant qui n'est pas utilisé. Fondamentalement, je peux écrire un modèle simple comme: $ pattern = "/javascript:tw(.*))/"; preg_match_all ($ motif, $ contenu, $ correspondances); $ id = $ correspond à [1] [0];

Cependant, dans ce cas, je reçois également les "ids" qui sont utilisés, donc je ne sais pas comment les exclure de l'équation. Toute idée serait très appréciée.

+0

whaaa? Étape 1: donnez-nous un exemple des données que vous voulez réellement renvoyer. Étape 2: Utilisez un analyseur, cela vous facilitera la vie. – Erik

+0

Comme vous pouvez le voir, j'ai besoin d'extraire les données qui se trouvent entre javascript: tw (et). Un exemple peut être 272896, 309206, 308845 etc ... Le problème que j'ai est que certains blocs html contiennent le mot "utilisé" ... " utilisé" .. et je ne devrais pas extraire le informations provenant des blocs contenant le mot "utilisé". – Michael

Répondre

0

utilisation print_r($matches)

édité:

preg_match('#\(([^)]+)\)#', $matches[1][0], $m); 
echo $m[1]; 
+0

ok et comment puis-je extraire uniquement les informations qui n'ont pas le mot "utilisé" dans le bloc html? si j'imprime les correspondances de mon patron il renvoie tous les Ids (qui ont utilisé le mot dans le bloc html et qui n'ont pas) – Michael

+0

la réponse éditée ne fait qu'échouer les nombres seulement. reportez-vous à http://stackoverflow.com/questions/3035258/php-regex-remove-bracket-in-string pour d'autres réponses. :) – apis17

1

Essayez ceci:

if (preg_match_all('~Used.*?javascript:tw\((\d+)\)~ig', $content, $matches)) 
{ 
    print_r($matches); 
} 

Mais, vous devez savoir, il y a une meilleure chance de 99,9% d'une façon de le faire. Avez-vous accès à la source de données?

+0

Malheureusement, votre motif ne donne aucun résultat. Je n'ai pas accès à la source de données ni à aucune API .... – Michael

0

Cela dépend un peu de la façon dont vos "blocs" html sont stockés en mémoire. Avez-vous un tableau de chaînes, dont chacune contient le code HTML pour un "bloc"? Si non, pouvez-vous en créer un en utilisant la fonction explode() de PHP? (Par exemple, $html_blocks = explode("<!---->", $all_html); si cette séquence de commentaires fait réellement partie de vos données plutôt que quelque chose que vous avez ajouté.)

Une fois les blocs séparés, vous pouvez utiliser preg_grep() pour trouver les blocs qui ne contiennent pas 'utilisé '. Donc, faire quelque chose comme ceci:

$unused_blocks = preg_grep("Used", $html_blocks, PREG_GREP_INVERT); 

Si vous voulez être plus prudent sur la correspondance, vous pouvez utiliser une autre expression rationnelle comme premier paramètre.

Maintenant vous avez $unused_blocks, qui est un tableau de chaînes html qui ne sont pas utilisées. Vous pouvez ensuite utiliser votre modèle preg_match() déjà existant pour extraire les identifiants de chacun.

Espérons que cela aide, ou vous rapproche de toute façon.

Questions connexes