2010-09-15 6 views
2

j'utilise PHP et j'ai texte comme:expressions régulières: obtenir ce qui est en dehors des supports

first [abc] middle [xyz] last 

Je dois obtenir ce qui est à l'intérieur et à l'extérieur des supports. Recherche dans StackOverflow J'ai trouvé un modèle pour obtenir ce qui est à l'intérieur:

preg_match_all('/\[.*?\]/', $m, $s) 

Maintenant, j'aimerais savoir le modèle pour obtenir ce qui est à l'extérieur.

Cordialement!

Répondre

4

Vous pouvez utiliser preg_split pour cela comme:

$input ='first [abc] middle [xyz] last'; 
$arr = preg_split('/\[.*?\]/',$input); 
print_r($arr); 

Sortie:

Array 
(
    [0] => first 
    [1] => middle 
    [2] => last 
) 

Cela permet à certains espaces environnants dans la sortie. Si vous ne voulez pas vous pouvez utiliser:

$arr = preg_split('/\s*\[.*?\]\s*/',$input); 

preg_split divise la chaîne en fonction d'un modèle. Le modèle ici est [ suivi de tout ce qui est suivi de ]. L'expression rationnelle correspondant à n'importe quoi est .*. Aussi [ et ] sont méta char regex utilisé pour la classe char. Puisque nous voulons les faire correspondre littéralement, nous devons leur échapper pour obtenir \[.*\]. .* est par défaut gourmand et va essayer de faire correspondre autant que possible. Dans ce cas, il correspond à abc] middle [xyz. Pour éviter cela nous le rendons non gourmand en l'ajoutant avec un ? pour donner \[.*?\]. Depuis notre définition de quelque chose ici signifie en fait autre chose que ] nous pouvons également utiliser \[[^]]*?\]

EDIT:

Si vous voulez extraire les mots qui sont à la fois à l'intérieur qu'à l'extérieur du [], vous pouvez utiliser:

$arr = preg_split('/\[|\]/',$input); 

qui divise la chaîne de caractères sur un [ ou un ]

+0

cela ne répond toujours pas aux exigences de l'OP? – RobertPitt

+0

@RobertPitt: Merci d'avoir choisi. J'ai mis à jour ma réponse. – codaddict

+0

Pas de problème, il est agréable de nettoyer les espaces tout en économisant les réglages, '/ \ s * \\ [| \\] \ s * /' – RobertPitt

2

Utilisez preg_split au lieu de preg_match.

preg_split('/\[.*?\]/', 'first [abc] middle [xyz] last'); 

Résultat:

array(3) { 
    [0]=> 
    string(6) "first " 
    [1]=> 
    string(8) " middle " 
    [2]=> 
    string(5) " last" 
} 

ideone

1
$inside = '\[.+?\]'; 
$outside = '[^\[\]]+'; 
$or = '|'; 

preg_match_all(
    "~ $inside $or $outside~x", 
    "first [abc] middle [xyz] last", 
    $m); 
print_r($m); 

ou moins bavard

preg_match_all("~\[.+?\]|[^\[\]]+~", $str, $matches) 
1

Comme tout le monde dit que vous devez utiliser preg_split, mais une seule personne a répondu avec une expression qui répond à vos besoins, et je pense que c'est un peu complexe - pas complexe, un peu à verbeux mais il a mis à jour sa réponse pour contrer cela.

Cette expression est ce que la plupart des réponses ont déclaré.

/\[.*?\]/ 

Mais cela n'imprime sur

Array 
(
    [0] => first 
    [1] => middle 
    [2] => last 
) 

et vous avez dit que vous vouliez ce qui est à l'intérieur et en dehors des accolades, sio une mise à jour serait:

/[\[.*?\]]/ 

Cela vous donne:

Array 
(
    [0] => first 
    [1] => abc 
    [2] => middle 
    [3] => xyz 
    [4] => last 
) 

mais comme vous pouvez voir que sa capture des espaces blancs et, laisse ainsi aller plus loin et de se débarrasser de ceux-ci:

/[\s]*[\[.*?\]][\s]*/ 

Cela vous donnera un résultat souhaité:

Array 
(
    [0] => first 
    [1] => abc 
    [2] => middle 
    [3] => xyz 
    [4] => last 
) 

Ce que je pense est l'expression de votre à la recherche de.

Here is a LIVE Demonstration of the above Regex

Questions connexes