2010-09-15 32 views
2

的外面,我有文字,如:正則表達式:得到的是我使用PHP支架

first [abc] middle [xyz] last 

我需要得到什麼內部和外部的括號。搜索在StackOverflow的我發現一個規律,以獲取裏面有什麼:

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

現在我想知道的格局得到只是表面現象。

商祺!

回答

4

您可以使用preg_split此爲:

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

輸出:

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

這允許輸出中的一些周圍空間。如果你不希望他們可以使用:

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

preg_split分割基於模式的字符串。這裏的模式是[,其次是]。匹配任何東西的正則表達式是.*。另外[]是用於char類的正則表達式元字符。因爲我們想要從字面上匹配它們,所以我們需要轉義它們以得到\[.*\].*默認爲貪婪,並儘可能匹配。在這種情況下,它將匹配abc] middle [xyz。爲了避免這種情況,我們通過給它添加一個?以使\[.*?\]不貪心。由於我們的東西在這裏DEF實際上意味着比]其他任何我們也可以使用\[[^]]*?\]

編輯:

如果你想提取的內部和[]外面的話,你可以使用:

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

其中分裂在[]

+0

這仍然不符合OP要求? – RobertPitt 2010-09-15 20:09:40

+0

@RobertPitt:感謝您的指點。我已經更新了我的答案。 – codaddict 2010-09-15 20:20:09

+0

沒問題,很好的清理空間並保存使用trim,'/ \ s * \\ [| \\] \ s * /' – RobertPitt 2010-09-15 20:45:42

2

使用preg_split代替preg_match。

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

結果:

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); 
字符串

以下詳細

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

由於每個人說,你應該使用使preg_split,但只有一個人回答道,以滿足您的需求, 一種表達,我認爲這是一個有點複雜 - 並不複雜,有點冗長,但他已經更新了他的答案以應對這種情況。

這個表達式是大多數回覆所說的。

/\[.*?\]/ 

但這隻能打印出

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

,你說你想要什麼內部和括號外,SIO的更新將是:

/[\[.*?\]]/ 

這給了你:

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

但只要你可以看到它捕捉空格爲好,這樣可以讓更進一步,擺脫那些:

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

這會給你一個想要的結果:

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

這個我覺得是表達你的尋找。

Here is a LIVE Demonstration of the above Regex