2010-01-29 10 views
0

J'ai un paragraphe de texte dans le format suivant:Chaîne analyse syntaxique aide

text text text <age>23</age>. text text <hobbies>...</hobbies> 

Je veux être en mesure de

1) Extrait du texte trouvé entre chaque balise <age> et <hobbies> trouvé dans la chaîne . Ainsi, par exemple, j'aurais un tableau appelé $ages qui contiendra tous les âges trouvés entre toutes les balises <age></age>, puis un autre tableau $hobbies qui aura le texte entre les balises <hobbies></hobbies> trouvées dans toute la chaîne.

2) être en mesure de remplacer les étiquettes qui sont extraites avec un marqueur, comme {age_444}, si le texte ci-dessus par exemple deviendrait

text text text {age_444}. text text {hobbies_555} 

Comment cela peut-il être fait?

+1

comment 23 devenir 444 et ... devenir 555? – YOU

+0

@s mark, je vais stocker '23' dans ma table 'ages', il obtiendra l'ageId de 444, d'où je vais mettre {age_444}, et même pour les loisirs –

Répondre

1
//Extract the age 
preg_match_all("#<age>(.*?)</age>#",$string,$match); 
$ages=$match[1]; 
//Extract the hobby 
preg_match_all("#<hobbies>(.*?)</hobbies>#",$string,$match); 
$hobbies=$match[1]; 

//Replace the age 
$agefn=create_function('$match','$query=mysql_query("select ageid...where age=".$match[1]); return "<age>{age_".mysql_fetch_object($query)->ageid."}</age>"'); 
$string=preg_replace_callback("#<age>(.*?)</age>#",$agefn,$string); 

//Replace the hobby 
$hobfn=create_function('$match','$query=mysql_query("select hobid...where hobby=".$match[1]); return "<hobbies>{hobbies_".mysql_fetch_object($query)->hobid."}</hobbies>"'); 
$string=preg_replace_callback("#<hobbies>(.*?)</hobbies>#",$hobfn,$string); 
+0

Grande réponse, mais je ne peux pas utiliser la partie create_function. Aussi mon code pour obtenir l'identifiant de l'âge, etc. sera très différent. Y a-t-il un autre moyen de remplacer l'âge? Je préférerais que la position du caractère de l'âge/hobbies puisse être récupérée en bouclant $ ages/$ hobbies, donc je peux utiliser substr_replace() pour remplacer l'age/hobby –

+0

Vous pouvez mettre l'indicateur PREG_OFFSET_CAPTURE dans le preg_match_all pour obtenir l'index. De toute façon pourquoi vous ne pouvez pas utiliser create_function? – mck89

+0

Si vous avez déjà préparé des fonctions pour l'âge et les loisirs au lieu de create_function, écrivez leur nom – mck89

-1
$string = '<age>23</age><hobbies>hobbietext</hobbies>'; 

$ageTemp = explode('<age>', $string); 
foreach($ageTemp as $key=>$value) 
{ 
    $age = explode('</age>', $value); 
    if(isset($age[0])) $ages[] = $age[0]; 
} 

$hobbiesTemp = explode('<hobbies>', $string); 
foreach($hobbiesTemp as $key=>$value) 
{ 
    $hobbie = explode('</hobbies>', $value); 
    if(isset($hobbie[0])) $hobbies[] = $hobbie[0]; 
} 

tableaux finaux sont $ passe-temps et les âges $

après que vous venez de remplacer ton aiguillon comme celui-ci:

foreach($ages as $key=>$value) 
{ 
    $string = str_replace('<age>'.$value.'</age>', '{age_'.$yourId.'}', $string); 
} 

foreach($hobbies as $key=>$value) 
{ 
    $string = str_replace('<hobbies>'.$value.'</hobbies>', '{hobbie_'.$yourId.'}', $string); 
} 
0

Si votre document source est une sorte de bien formé XML (ou s'il peut être facilement mis dans cette forme au moins), vous pouvez utiliser XSLT/XSL-FO pour transformer votre document.

Recherche d'informations jointes par <> les balises et leur réorganisation/extraction sont l'une des principales caractéristiques. Vous pouvez utiliser autonomes XSLT/XSL-FO ou dans différentes langues (Java, C, même Visual Basic)

Qu'est-ce que vous avez besoin est votre document source et un document décrivant les règles de transformation. La machine de rendu ou la fonction de bibliothèque fera le reste.

Espérons que ça aide. Bonne chance