2011-07-15 31 views
0

我有一個字符串,它看起來像這樣:正則表達式得到一個反向引用一個可選的部分

提交1052(主題)由用戶

刪除該字符串後,有可能是一個冒號隨後是刪除的原因。現在,我需要在PHP的preg_replace中反向引用,以我想要的方式替換它(在我的情況下,我鏈接了用戶名)。我已經嘗試了很多表達式,但我似乎無法獲得我想要的結果。大多數情況下,我的表達式導致鏈接在冒號後繼續(我希望鏈接在冒號之前停止)。

我現在使用的正則表達式如下:

<?php preg_replace("/Submission ([0-9]+) (\(.*\)) was deleted by user (.*)(|: .*)/",'<span style="color:red;">Submission <a href="#">$1</a> $2 was deleted by user <a href="#">$3</a>$4</span>',$string) ?> 

在這裏,我基本上認爲(|:*)將檢查空字符串OR(|)冒號後面什麼(但我認爲我錯了)。

+0

爲什麼不分裂的' 「:」'第一? – 2011-07-15 03:36:19

+0

拆分?你有什麼想法?使preg_split? – Nisto

+0

號碼先拆分。一個問題就足夠了。 – 2011-07-15 03:52:52

回答

1

編輯根據您的評論。

我在*之後放了一個?,這使得它非貪婪。事實上,它把所有東西都抓到了最後。

...user (.*?)(: .*)?$ 

說明:

(.*?) # Match any number of chars as short as possible. 
(: .*)? # Match 0 or 1 of : .*. 
$  # Match the end of the line. 
+0

不幸的是,這也不起作用。該鏈接仍然延伸到結腸。我認爲這與團體緊挨着在一起。 – Nisto

+0

我已經調整了正則表達式,以便在用戶非貪婪之後創建第一個'。*',這意味着它將匹配儘可能短的字符串。 –

+0

太棒了。非常感謝! – Nisto

相關問題