2014-01-06 32 views
0

我正在尋找所有我的bbcode圖像有一個鏈接連接到他們被解析之前正常[img]標籤解析完成在我的代碼,這是因爲我的正常[img]標籤,如果他們沒有鏈接變成一個燈箱。困惑在正則表達式

$find = array(
    "/\[url=(.+?)\](?=\[img\](.+?)\[\/img\])\[\/url\]/is" 
    ); 

    $replace = array(
    "<a href=\"$1\" target=\"_blank\"><img src=\"$2\" class=\"bbcodeimage img-polaroid\" alt=\"[img]\" /></a>" 
    ); 

    $body = preg_replace($find, $replace, $body); 

完全錯誤的,因爲它實際上並沒有做任何事情,看來我對整個事情前瞻完全糊塗捕捉[IMG]前有一個[URL]標籤和相應的更換。

+3

...或者你可以只使用DOM和XPath,讓你的生活更輕鬆...找到其他節點內部的節點是XPath查詢的基石特性。 –

+0

除非他正在處理不能被DOM/XPath解析器解析的格式錯誤的HTML。在這種情況下,我會說「修復你的html和^」 – crush

+0

@MarcB我們應該停止評論「使用DOM!」到最正則的表達主題。 DOM運行良好,但不像簡單任務那樣簡單。使用正則表達式不會傷害! – revo

回答

2

我認爲你不需要向前看。試試這個:

$find = array(
    '~\[url=([^]]+)]\[img]([^[]+)\[/img]\[/url]~i' 
); 

$replace = array(
    '<a href="$1" target="_blank"><img src="$2" class="bbcodeimage img-polaroid" alt="[img]" /></a>' 
); 

說明:

首先,在所有的,我已經改變了格局分隔符~,這種變化的目的是爲了避免逃避型中的所有文字/。文字]不需要在字符類外部或字符類內部轉義,如果(且僅當)它是第一個字符。

在這種情況下,超前並不是有用的,因爲超前只是一張支票而且什麼都不匹配。示例a(?=bc)將找到一個a,然後是bc,但只會匹配a。這就是爲什麼向前看和向後看也被稱爲「零寬度斷言」的原因。

圖案的詳細資料:

~   # delimiter 
\[url=  # literal: [url= 
(   # open the first capturing group 
    [^]]+ # all characters except ] (one or more times) 
)   # close the first capturing group 
]   # literal: ] 
\[img]  # literal: [img] 
(   # open the second capturing group 
    [^[]+ # all characters except [ (one or more times) 
)   # close the second capturing group 
\[/img]  # literal: [/img] 
\[/url]  # literal: [/url] 
~i   # delimiter and i modifier 

請注意,我已經選擇使用單引號替換字符串,以避免逃避字符串的所有雙引號(因爲沒有理由使用雙引號,沒有變量,沒有\n\t等)。

+1

我已經測試過,這很棒並且像伏都教魔術一樣工作,思想擴大了答案來解釋它一點點? – NaughtySquid