2013-05-02 104 views
2

得到括號之間的內容我有一個字符串,像這樣:如何使用正則表達式

[abc] 12345 [abc] 67890 [/abc] [/abc] 

我想括號內的內容相匹配,但如果另一個開口支架被發現,但返回匹配(例如, [abc])。功能/\[abc\](.*)\[\/abc\]/i將輸出:

12345 [abc] 67890 [/abc] 

但是,這不是我想要的,因爲這裏的文本中的另一個開口支架。預期的結果是:

67890 

有關如何解決它的任何建議?

+0

如果你需要用這樣的語法提出並解決複雜的問題,你可能需要一個完整的詞法分析器(也稱爲標記器)和分析器系統,對於這個問題,正則表達式可行,但對於更難的問題,它不會完美 – Patashu 2013-05-02 06:07:03

回答

3

是的,你不希望使用[^\[\]]*代替.*,讓您的標籤之間的括號只是狀態(這將匹配任何,包括支架):

/\[abc\]([^\[\]]*)\[\/abc\]/i 
+0

完美謝謝.. – user2103849 2013-05-02 05:41:00

+0

+1只是出於興趣,如果我想要防止類似:[a] [/ b]。我是否需要編寫更多的表達式,或者是否有方法來改變您編寫的表達式,以便只允許[a] [/ a]。 etc – Touch 2013-05-02 05:50:30

+2

@Touch:這將已被禁止,因爲標籤之間不允許任何括號。當你想允許*其他*標籤時,它會變得有趣。 G。允許'[a] foo [b] bar [/ b] baz [/ a]'但禁止'[a] foo [a] bar [/ a] baz [/ a]''。爲此,您需要向前看斷言(或遠離正則表達式完全進入解析器世界)。 – 2013-05-02 05:53:31

0

嘗試這種模式:

\[[^\/\]]*\]([^\[]*)\[\/[^\]]*\] 

\[ --->字符[

[^\/\]]* --->讀數據直到它到達]/

\] --->字符]

[^\[]* --->讀直到字符[達到

() --->表示數據組我們可以選擇該組作爲\1

演示http://rubular.com/r/shwsqTE61R

0

什麼新鮮事,但更短的寫:

$subject = '[abc] 12345 [abc] 67890 [/abc] [/abc]'; 
$pattern = '~\[abc]\K[^[]++(?=\[/abc])~i'; 
preg_match($pattern, $subject, $result); 
0

檢查這種模式:

(\d+)(?:\s*\[/abc\]\s*)+$ 

將目光從右側跳過所有結束標籤,如[/abc],並挑選第二天號。