得到括號之間的內容我有一個字符串,像這樣:如何使用正則表達式
[abc] 12345 [abc] 67890 [/abc] [/abc]
我想括號內的內容相匹配,但如果另一個開口支架被發現,但返回匹配(例如, [abc]
)。功能/\[abc\](.*)\[\/abc\]/i
將輸出:
12345 [abc] 67890 [/abc]
但是,這不是我想要的,因爲這裏的文本中的另一個開口支架。預期的結果是:
67890
有關如何解決它的任何建議?
得到括號之間的內容我有一個字符串,像這樣:如何使用正則表達式
[abc] 12345 [abc] 67890 [/abc] [/abc]
我想括號內的內容相匹配,但如果另一個開口支架被發現,但返回匹配(例如, [abc]
)。功能/\[abc\](.*)\[\/abc\]/i
將輸出:
12345 [abc] 67890 [/abc]
但是,這不是我想要的,因爲這裏的文本中的另一個開口支架。預期的結果是:
67890
有關如何解決它的任何建議?
是的,你不希望使用[^\[\]]*
代替.*
,讓您的標籤之間的括號只是狀態(這將匹配任何,包括支架):
/\[abc\]([^\[\]]*)\[\/abc\]/i
完美謝謝.. – user2103849 2013-05-02 05:41:00
+1只是出於興趣,如果我想要防止類似:[a] [/ b]。我是否需要編寫更多的表達式,或者是否有方法來改變您編寫的表達式,以便只允許[a] [/ a]。 etc – Touch 2013-05-02 05:50:30
@Touch:這將已被禁止,因爲標籤之間不允許任何括號。當你想允許*其他*標籤時,它會變得有趣。 G。允許'[a] foo [b] bar [/ b] baz [/ a]'但禁止'[a] foo [a] bar [/ a] baz [/ a]''。爲此,您需要向前看斷言(或遠離正則表達式完全進入解析器世界)。 – 2013-05-02 05:53:31
嘗試這種模式:
\[[^\/\]]*\]([^\[]*)\[\/[^\]]*\]
\[
--->字符[
[^\/\]]*
--->讀數據直到它到達]
或/
\]
--->字符]
[^\[]*
--->讀直到字符[
達到
()
--->表示數據組我們可以選擇該組作爲\1
什麼新鮮事,但更短的寫:
$subject = '[abc] 12345 [abc] 67890 [/abc] [/abc]';
$pattern = '~\[abc]\K[^[]++(?=\[/abc])~i';
preg_match($pattern, $subject, $result);
檢查這種模式:
(\d+)(?:\s*\[/abc\]\s*)+$
將目光從右側跳過所有結束標籤,如[/abc]
,並挑選第二天號。
如果你需要用這樣的語法提出並解決複雜的問題,你可能需要一個完整的詞法分析器(也稱爲標記器)和分析器系統,對於這個問題,正則表達式可行,但對於更難的問題,它不會完美 – Patashu 2013-05-02 06:07:03