2010-09-10 6 views
0

J'ai les chaînes possibles suivantes que je dois transformer en tableaux afin que je puisse les nourrir dans un générateur html. Je ne suis pas en train de regarder le HTML ou le XML, j'essaye de créer un raccourci qui me permettra de remplir mes objets html plus facilement et plus rapidement avec un code plus lisible.regex pour extraire les noms et les valeurs des attributs

 
id='moo' 
id = "foo" type= doo value ='do\"o' 
on_click='monkeys("bobo")' 

J'ai besoin de retirer les attribs et leurs valeurs correspondantes. Ces chaînes d'attributs ne sont pas associées à une balise html ou xml. Et je voudrais le faire avec 1 à 3 expressions régulières

  • La valeur peut être encapsulé soit par des guillemets simples ou doubles
  • Si la valeur est encapsulée par des guillemets, il peut également contenir des espaces, des citations différentes à partir de guillemets encapsulés ou de guillemets échappés qui sont identiques aux guillemets encapsulés.
  • Il peut y avoir ou non des espaces entre les valeurs attrib et =, et = et.

Les résultats éventuels devraient ressembler à:

 
array(1) { 
    [id] => moo 
} 
array(3) { 
    [id] => foo 
    [type] => doo 
    [value] => do"o 
} 
array(1) { 
    [on_click] => monkeys("bobo") 
} 

mais si elle se révèle comme:

 
array(2) { 
    [0] => id 
    [1] => moo 
} 
array(6) { 
    [0] => id 
    [1] => moo 
    [2] => class 
    [3] => foo 
    [4] => value 
    [5] => do"o 
} 

array(2) { 
    [0] => on_click 
    [1] => monkeys("bobo") 
} 

je peux réarranger à partir de là.

Quelques regexes précédents, j'ai essayé d'utiliser et de leurs problèmes:

  • /[\s]+/ - Retour paires attrib/valeur que s'il n'y avait pas d'espace autour des =
  • /(?<==)(\".*\"|'.*'|.*)$/ - Retourne la valeur, y compris les citations encapsulant. Il ignore les guillemets échappés dans la valeur.
  • /^[^=]*/ - Retourne l'attribut très bien. indépendamment des espaces entre attrib et =
+0

grâce à #regex pour moi d'obtenir au moins loin! –

+0

Nous avons besoin d'un site d'échange de pile dédié aux questions regex. Sérieusement. – webbiedave

+0

@web: http://area51.stackexchange.com/proposals/2203/regex – kennytm

Répondre

1

Une raison particulière pour laquelle vous souhaitez utiliser regex spécifiquement ici? On dirait qu'un analyseur syntaxique basé sur des jetons pourrait mieux fonctionner pour vous, car vous devez conserver plus d'états que ce que vous pouvez faire dans une regex.

+0

des suggestions sur comment je devrais aller à ce sujet? –

+0

Machine d'état, analysant les "jetons" et sachant à quoi s'attendre. Commence par chercher un identifiant, puis (en sautant des espaces), un '='. Puis un de ',' et un mot, suivis de la même citation, OU juste un jeton de mot sans guillemets Répétez si nécessaire – zigdon

0

Tyson,

Il semble que vous avez déjà fait une analyse syntaxique pour supprimer les éléments XML/HTML, et tentent maintenant de traiter les attributs restants. En général, les expressions régulières ne sont pas suffisantes pour analyser XML/HTML.

Si vous avez accès au XML/HTML, vous devriez envisager d'utiliser une bibliothèque de traitement DOM/une extension PHP pour lire en XML/HTML, et parcourir/analyser les éléments et les attributs.

est ici une référence exemple:

+0

Malheureusement non, je mets un cadre sur le DOM pour faciliter la génération de contenu xml plus rapidement. familier avec le dom et j'essaye de faire un outil qui analysera une chaîne d'attribut dans un tableau ainsi je peux le nourrir dans mes objets de dom. –

Questions connexes