2010-08-19 5 views
0

J'ai une chaîne avec des codes (ex: «USER_ID # USERNAME # ÉTAT») pour le remplacement comme dans cet exemple:Regex trouver des balises spécifiques pour remplacer dans une chaîne

Bonjour «USER_ID # USERNAME # STATUT », Vous aimez« PROD_ID # PRODNAME # STATUS »?

Je dois trouver un moyen d'obtenir tous les codes pour un remplacement futur.

Je peux facilement trouver un code avec cette regex:

/«(.*)#(.*)#(.*)»/ 

mais ne peut pas trouver un moyen d'obtenir tous les codes avec preg_match_all.

Quelqu'un peut-il m'aider? J'utilise PHP.

Merci

Répondre

0

essayer

preg_match_all('/«(?<id>.*?)#(?<username>.*?)#(?<status>.*?)»/',$string,$matches); 
echo $matches[0]['username']; 

//And dont forget you have to loop. 
foreach($matches as $match) 
{ 
    echo $match['username']; 
} 

:)

array(7) { 
    [0]=> 
    array(2) { 
    [0]=> 
    string(27) "«USER_ID#USERNAME#STATUS»" 
    [1]=> 
    string(27) "«PROD_ID#PRODNAME#STATUS»" 
    } 
    ["id"]=> 
    array(2) { 
    [0]=> 
    string(7) "USER_ID" 
    [1]=> 
    string(7) "PROD_ID" 
    } 
    [1]=> 
    array(2) { 
    [0]=> 
    string(7) "USER_ID" 
    [1]=> 
    string(7) "PROD_ID" 
    } 
    ["username"]=> 
    array(2) { 
    [0]=> 
    string(8) "USERNAME" 
    [1]=> 
    string(8) "PRODNAME" 
    } 
    [2]=> 
    array(2) { 
    [0]=> 
    string(8) "USERNAME" 
    [1]=> 
    string(8) "PRODNAME" 
    } 
    ["status"]=> 
    array(2) { 
    [0]=> 
    string(6) "STATUS" 
    [1]=> 
    string(6) "STATUS" 
    } 
    [3]=> 
    array(2) { 
    [0]=> 
    string(6) "STATUS" 
    [1]=> 
    string(6) "STATUS" 
    } 
} 
3

Vous devez faire votre motif non gourmand:

/«(.*?)#(.*?)#(.*?)»/ 

Voir this.

2
$string = "Hello «USER_ID#USERNAME#STATUS», do you like «PROD_ID#PRODNAME#STATUS»?"; 

preg_match_all('/«(.*)#(.*)#(.*)»/U',$string,$matches); 

echo '<pre>'; 
var_dump($matches); 
echo '</pre>'; 

donne

array(4) { 
    [0]=> 
    array(2) { 
    [0]=> 
    string(25) "«USER_ID#USERNAME#STATUS»" 
    [1]=> 
    string(25) "«PROD_ID#PRODNAME#STATUS»" 
    } 
    [1]=> 
    array(2) { 
    [0]=> 
    string(7) "USER_ID" 
    [1]=> 
    string(7) "PROD_ID" 
    } 
    [2]=> 
    array(2) { 
    [0]=> 
    string(8) "USERNAME" 
    [1]=> 
    string(8) "PRODNAME" 
    } 
    [3]=> 
    array(2) { 
    [0]=> 
    string(6) "STATUS" 
    [1]=> 
    string(6) "STATUS" 
    } 
} 

Notez l'utilisation du commutateur Ungreedy.

Je suis sûr que quelqu'un sera le long bientôt modifier l'expression régulière afin qu'il soit intrinsèquement ungreedy

+0

désolé, par mauvais, io copiais votre échantillon pour enregistrer l'écriture de code et appuyez sur la downvote, vous avez donné un upvote pour la gêne occasionnée et que votre code est correct – RobertPitt

+0

@Robert - vous feriez mieux d'utiliser l'exemple d'Artefacto qui rend le modèle non répréhensible, plutôt que le commutateur ungreedy; mais merci quand même –

+0

mon exemple est ci-dessous, je ne suis pas en train d'utiliser la correspondance gourmande, '(? . *?)' – RobertPitt

Questions connexes