2010-07-09 16 views
0

J'ai besoin d'un langage de balisage simple pour stocker différentes parties d'une chaîne dans un champ TEXT, puis extraire ces parties. Donc, fondamentalement, je veux une sorte de XML simple. Stocker ceux dans le champ de la table est facile, mais les extraire ... est autre chose. j'ai réussi à le faire en utilisant un simple regex fait pour HTML normal:Une expression régulière pour extraire le texte entre deux balises et AUSSI le nom du tag

|<[^>]+>(.*)</[^>]+>|U 

Mais pour recomposer le tableau original (et utiliser plus généralement le balisage) Je dois aussi connaître les noms de balises. Et cette regex ne fait pas ça.

Exemples:

texte d'entrée:

<user_input>Hello! my name is Williams</user_input> 

La fonction preg_match_all() en utilisant les déclarations regex ci-dessus:

array 
    0 => 
    array 
     0 => string '<user_input>Hello! my name is Williams</user_input>' (length=34) 

    1 => 
    array 
     0 => string 'Hello! my name is Williams' (length=34) 

j'ai besoin de retourner le nom de "user_input" du marque. Oui, je sais, je suce sur regex. Oui, je sais "utiliser un analyseur XML", mais c'est trop grand pour ce que je fais.

+2

Votre regex est gourmande et va se casser horriblement avec quelque chose de complexe. Il ne vérifie pas que les balises correspondent. Il échouera horriblement s'il y a plus de deux étiquettes. Je suis sûr qu'il a d'autres bugs. – Turtle

+2

_ "Donc, fondamentalement, je veux un type de XML simple." _ -il arrive que PHP arrive avec une extension appelée 'SimpleXML': http://www.php.net/simplexml –

Répondre

0

Il suffit d'utiliser un groupe de capture comme vous avez fait avec le contenu:

|<([^>]+)>([^<]*)</\1>| 

En prime, vous pouvez utiliser le nom capturé pour vous assurer que la balise de fermeture a le même nom.

+0

Merci! Fonctionne parfaitement!. – Diego

1

Donc, fondamentalement, je veux une sorte de simple XML

Ensuite, vous voulez un analyseur XML. Et bon, PHP a une extension d'analyse XML que vous pouvez installer. Sérieusement, essayer de pirater votre chemin avec des regex ne va que finir dans la douleur et la frustration. Utilisez un analyseur XML et économisez des heures de travail.

mais c'est trop grand pour ce que je fais.

Non, ce n'est pas le cas. Vous voulez analyser quelque chose - par conséquent, vous devriez utiliser un analyseur.

+0

Il est intéressant quand les gens downvote quelque chose sans laisser de commentaire.Vous avez perdu le rep, la réponse ne s'est pas améliorée - qu'as-tu atteint exactement? –

+0

Je recommande de recommander l'utilisation d'un analyseur XML, mais que diriez-vous de fournir un exemple de l'utiliser pour résoudre le problème de l'op? Cela l'aiderait à comprendre comment cela fonctionne au lieu des réponses de type "RTFM". –

+0

@meder: Je ne suis pas vraiment un gourou PHP - pour publier un exemple de code de travail, je dois installer PHP, tout bien configurer, et tester mon code plusieurs fois pour m'assurer que cela fonctionne. Je préférerais poster une réponse utile pointant le demandeur dans la bonne direction, même si elle est laconique sur le code de copie-passable. Cela dit, votre réponse est meilleure que la mienne, et je l'ai mise en valeur pour être correcte et donner un exemple d'utilisation. –

6

En quoi un analyseur XML est-il "trop ​​grand"? PHP a des fonctions natives intégrées qui vous permettent de le faire facilement.

Regex ne correspond pas au travail.

<?php 

$string = ' 
<root> 
<input_name>blah</input_name> 
</root> 
'; 

$x = new DOMDocument(); 
$x->loadXML($string); 
$root = $x->documentElement; 
$elements = $root->getElementsByTagName('*'); 
$count = count($elements->length); 

for ($i = 0; $i< $count; $i++) { 
    $el = $elements->item($i); 
    echo $el->nodeName . '<br>'; 
    echo $el->nodeValue . '<br>'; 
} 
+1

Vous pouvez également utiliser simplexml. –

0
|<([^>]+)>(.*)</[^>]+>|U 

fera ce que vous voulez. J'ai simplement ajouté deux parenthèses. C'est un hack très fragile. Vous voulez utiliser un analyseur. Surtout que vous ne comprenez apparemment pas les expressions rationnelles.

Questions connexes