2014-03-25 24 views
0

因爲我一直在使用preg_replace_callback更換參考ID出現的任何進入打開的引用鏈接很長一段時間。preg_replace_callback發生,除非存在反斜槓字符0-20提前

例如, 「BIZ1234」 將與名稱標題(僞代碼)

所有好的替代。

但現在我需要做更換如果反斜槓之前的比賽。

例如,如果「BIZ1234」中的文件夾路徑時:\ drive_C \ BIZ1234

爲此,我已經試過了很多的正則表達式,並幾乎得到了我所需要的,但我的技能正則表達式是不夠的。

當前正則表達式:

/BIZ(\d+)/i 

排除出現嘗試在反斜槓之前的比賽:

/[^\\\\]BIZ(\d+)/i 

這工作,如果反斜槓是BIZ權盈。 我知道我必須設置某種限制,以反斜槓能走多遠背面。所以我嘗試:

/[^\\\\](.{0,20})BIZ(\d+)/i 

這個替換太多,不關心反斜槓。

我已經閱讀並閱讀,但就是無法把握住這些正則表達式。幫幫我! :-)

EDIT/ADDED:目前

<p>This should become a link BIZ1234</p> 
<p>this/here/should/too BIZ1234</p> 
<p>but\this\here\shouldn't BIZ1234</p> 

,使用該正則表達式:

我使用作爲測試字符串以下(以下爲字符串)

/^([^\\\]+)BIZ(\d+)/ 

取代上述字符串中的任何內容。

+0

'[^ \\\\]'沒有多大意義:'[^ ...]'指任何字符*不*的'...',所以沒必要一個重複反斜槓。你可能想看看[lookarounds](http://www.regular-expressions.info/lookaround.html)。 – Biffen

+1

@biffen,在傳遞給Preg_replace_callback的PHP字符串的上下文中是有意義的:由於反斜槓是正則表達式中的一個特殊字符,因此您必須將其轉義 - 使\\表示正則表達式中的_one_反斜槓。它也是PHP字符串中的一個特殊字符,所以它也必須在那裏轉義 - 我們在這裏有兩個反斜槓,它們是字符串中的內容,而每個字符都會使用_four_反斜槓。 – CBroe

+0

@CBroe我認爲regexen顯示的是* un-escaped *,因爲裏面有'\ d'。 – Biffen

回答

2

作爲lookbehind alternative, could use \K重置比賽開始:

$pattern = '/>[^<\\\]*\KBIZ(\d+)/'; 

這會從那裏你把\K只能更換。

所以對於隨後[^<\\\]*是不是<或反斜槓字符的任意量,其次是BIZ但復位,並開始只是BIZ之前更換例如比賽>

Example at eval.in

+0

這個工程!非常感謝! :-D –

+0

歡迎!很高興它可以幫助你:) –