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 ]
cela ne répond toujours pas aux exigences de l'OP? – RobertPitt
@RobertPitt: Merci d'avoir choisi. J'ai mis à jour ma réponse. – codaddict
Pas de problème, il est agréable de nettoyer les espaces tout en économisant les réglages, '/ \ s * \\ [| \\] \ s * /' – RobertPitt