2012-06-27 9 views
0

J'ai un problème avec la fonction regexp, preg_replace(), en PHP. Je souhaite obtenir viewstate à partir de l'entrée de html, mais cela ne fonctionne pas correctement.PHP preg_replace();

Ce code:

$viewstate = preg_replace('/^(.*)(<input\s+id="__VIEWSTATE"\s+type="hidden"\s+value=")(.*[^"])("\s+name="__VIEWSTATE">)(.*)$/u','^\${3}$',$html); 

Retours: ce

%0D%0A%0D%0A%3C%21DOCTYPE+html+PUBLIC+%22-%2F%2FW3C%2F%2FDTD+XHTML+1.0+Transitional%2F%2FEN%22+%22http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml1%2FDTD%2Fxhtml1-transitional.dtd%22%3E%0D%0A%0D%0A%3Chtml+xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22+%3E%0D%0A%3Chead%3E%3Ctitle%3E%0D%0A%09Strava.cz%0D%0A%3C%2Ftitle%3E%3Clink+rel%3D%22shortcut+icon%22+href%3D%22..%2FGrafika%2Ffavicon.ico%22+type%3D%22image%2Fx-icon%22+%2F%3E%3Clink+rel%3D%22stylesheet%22+type%3D%22text%2Fcss%22+media%3D%22screen%22+href%3D%22..%2FStyly%2FZaklad.css%22+%2F%3E%0D%0A++++%3Cstyle+type%3D%22text%2Fcss%22%3E%0D%0A++++++++.style1%0D%0A++++++++%7B%0D%0A++++++++++++width%3A+47px%3B%0D%0A++++++++%7D%0D%0A++++++++.style2%0D%0A++++++++%7B%0D%0A++++++++++++width%3A+64px%3B%0D%0A++++++++%7D%0D%0A++++%3C%2Fstyle%3E%0D%0A%0D%0A%3Cscript+type%3D%22text%2Fjavascript%22%3E%0D%0A%0D%0A++var+_gaq+%3D+_gaq+%7C%7C+%5B%5D%3B%0D%0A++_gaq.push%28%5B 

EDIT: Désolé, je laisse cette question depuis longtemps. Enfin, j'ai utilisé DOMDocument.

+0

double possible [RegEx correspondance balises ouverts à l'exception des balises autonomes XHTML] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self -contained-tags) – Amber

+0

Je veux seulement savoir, pourquoi cela ne fonctionne pas :( – m93a

Répondre

1

Vous ne devez capturer que lorsque vous envisagez d'utiliser les données. Donc, la plupart() sont obsolètes dans ce modèle d'expression rationnelle. Pas une cause d'échec mais je pensais en parler. Au lieu d'utiliser [^ "] pour marquer que vous ne voulez pas ce caractère, vous pouvez utiliser le modificateur non glouton - ?, ce qui garantit que le motif correspond le moins possible. .. la valeur ce qui devrait être en sécurité

Mettons cela en pratique et simplifier le modèle certains, cela fonctionne comme vous voulez.

'/.*<input\s+id="__VIEWSTATE"\s+type="hidden"\s+value="(.+?)"\s+name="__VIEWSTATE">.*/' 

Je strongly recommend vérifier an alternative to regexp pour les opérations DOM cela rend certain votre code fonctionne aussi si les attributs changent d'ordre. nous c'est tellement plus agréable de travailler avec.

+0

Il ne fonctionne toujours pas - Je vais trouver une autre façon.Merci :) – m93a

2

Pour être sûr que je serais diviser ce match en deux phases:

  1. Trouver l'élément d'entrée correspondant
  2. Obtenez la valeur

Parce que vous ne pouvez pas être certain de ce que les attributs ordre dans l'élément sera.

if(preg_match('/<input[^>]+name="__VIEWSTATE"[^>]*>/i', $input, $match)) 
    $value = preg_replace('/.*value="([^"]*)".*/i', '$1', $match[0]); 

Et, bien sûr, toujours considérer DOM et DOMXpath sur regex pour parser html/xml.

+0

Je peux être certain, parce que la valeur est la seule chose que changements :) Mais merci. – m93a