2013-12-07 33 views
0

我試圖找到以下情形的模式:PHP,正則表達式,字符串之間

可以說我有這個字符串:

someString [代碼]一些代碼[/代碼] someString

現在一些代碼可以是任何東西,我想要得到的是保留字(休息,類等),所以對於一個真實的情景,這是一個字符串:

someString 
[code] 
class someClass{} 
[/code] 
someString 

// And again 

someString 
[code] 
class someClass{} 
[/code] 
someString 

所以我想了解的是我怎麼能匹配所有的[code] [/ code]標籤之間的所有保留字。

例如:[code]someReservedWord some text anotherReservedWord[/code]我只想匹配someReservedWord和anotherReservedWord

我想用preg_match_all這樣我就可以得到所有保留字,每個[代碼]中[/代碼]並使用PREG_OFFSET_CAPTURE得到他們的位置,

我唯一想不通如果有人知道我會非常感謝,謝謝大家,祝你有美好的一天。

回答

3

您可以使用此:

$pattern = <<<'LOD' 
~ (?(DEFINE) (?<words> class | string | function)) 

(?: \[code] | \G(?<!^)) 
(?: [^[]+? | \[(?!/code]))*? \K 
\b \g<words> \b 

~x 
LOD; 

preg_match_all($pattern, $subject, $matches, PREG_OFFSET_CAPTURE); 

print_r($matches[0]); 

圖案的詳細資料:

首先,在所有我們定義了一個名爲組的保留字:

(?(DEFINE) (?<words> class | string | function)) 

(?(DEFINE)...)語法允許定義子模式脫離模式本身。您可以在\g<words>的模式中稍後調用命名組「文字」。

(?: [^[]+? | \[(?!/code]))*?描述保留字前的所有內容。此子模式可以匹配除結束標記[/code]之外的所有子模式,因爲您可以在「所有不是[[或]」之後選擇「[/code」之後沒有。由於它可以匹配全部,因此當遇到保留字時,惰性量詞用於停止匹配。

該模式的入口點是(?: \[code] | \G(?<!^))。這會強制匹配以[code]標記開始或與先前匹配相鄰。

\G是錨定,這意味着「在字符串的開始或鄰接的先例匹配」隨着負回顧後(?<!^),則禁止該字符串的開始。)

\K是一種把匹配結果之前的所有匹配內容復位的技巧。

+0

嘿,你能解釋一下你的代碼.... –

+0

謝謝卡西米爾,一個愉快的一天有。 –

0
$str = "someString[code]some code[/code]someString"; 
$ret = preg_replace('#\[code\](.+)\[\/code\]#iUs', '<FOUND>$1</FOUND>', $str); 
var_dump($ret); 

http://www.phpliveregex.com/p/2tD,見preg_match_all例子)

你也許谷歌的BB-代碼PHP正則表達式。

+0

我不希望所有字符只有特定的人作爲類|破|此而不是(+)。 –

相關問題