2010-06-03 10 views
0

J'essaie d'analyser cette chaîne:chaîne d'analyse avec une expression régulière

$right = '34601)S(1,6)[2] - 34601)(11)[2] + 34601)(3)[2,4]'; 

avec regexp suivant:

const word = '(\d{3}\d{2}\)S{0,1}\([^\)]*\)S{0,1}\[[^\]]*\])'; 
preg_match('/'.word.'{1}(?:\s{1}([+-]{1})\s{1}'.word.'){0,}/', $right, $matches); 
print_r($matches); 

je veux revenir tableau comme ceci:

Array 
(
    [0] => 34601)S(1,6)[2] - 34601)(11)[2] + 34601)(3)[2,4] 
    [1] => 34601)S(1,6)[2] 
    [2] => - 
    [3] => 34601)(11)[2] 
    [4] => + 
    [5] => 34601)(3)[2,4] 
) 

mais je retour seulement suivant:

Array 
(
    [0] => 34601)S(1,6)[2] - 34601)(11)[2] + 34601)(3)[2,4] 
    [1] => 34601)S(1,6)[2] 
    [2] => + 
    [3] => 34601)(3)[2,4] 
) 

Je pense, c'est à cause de [^)] * ou [^]] * dans le mot, mais comment je dois corriger regexp pour faire correspondre cela d'une autre manière?

Je tryied de le préciser:

\d+(?:[,#]\d+){0,} 

si mot devient

const word = '(\d{3}\d{2}\)S{0,1}\(\d+(?:[,#]\d+){0,}\)S{0,1}\[\d+(?:[,#]\d+){0,}\])'; 

mais il ne donne rien

+0

Eh bien, je l'utilise, et cela fonctionne preg_match_all ('/ (?: \ S {1} ([+ -] {1}) \ s {1}) {0,}' mot. '/', $ Droite, $ correspond); – llamerr

+0

donc il fonctionne avec ceci preg_match_all ('/ (?: \ S {1} ([+ -] {1}) \ s {1}) {0,}'. Mot. '/', $ Droite, $ matches); et une autre question, puis-je faire correspondre toutes les occurrences de mot après le premier mot avec preg_match, ou je dois utiliser preg_match_all? – llamerr

Répondre

0
bien

, j'utiliser, et il fonctionne

preg_match_all('/(?:\s{1}([+-]{1})\s{1}){0,}'.word.'/', $right, $matches); 
Questions connexes