2012-03-21 66 views
1

我有這種模式,我與preg_match一起使用,我無法確定我出錯的地方。模式不轉義字符

$pattern = "{(\[fn:)([0-9]*)(\])((?:\\\[|[^\[])*)}"; 

它具有以匹配每個[FN:I] text_multiline直到另一個開始,從而當它滿足[,我想escapte的[通過\ [從下面的例子:

[FN:1]這是\文[這需要轉義]腳註1

注意,這可能是含多處電子段落。

[FN:2]這是腳註2

這文字就是我得到此刻的比賽:

array(5) { 
    [0]=> 
    string(6) "[fn:1]" 
    [1]=> 
    string(4) "[fn:" 
    [2]=> 
    string(1) "1" 
    [3]=> 
    string(1) "]" 
    [4]=> 
    string(0) "" 
} 
+0

你的分隔符必須匹配。你不能使用'{'和'} – AndrewR 2012-03-21 16:15:21

+1

我真的不認爲這是問題所在。我以前使用過這個分隔符的模式,它工作正常。 – 2012-03-21 16:16:50

+1

嗯,我想那些是有效的分隔符。我不知道這會起作用。 :) – AndrewR 2012-03-21 16:19:08

回答

2

當你想排除和逃避時使用的技術[稱爲「負面看」。

例如,

(?<!\\)\[ 

此正則表達式匹配[卻忽略瞭如果由\

繼續讓我知道如果你需要更多的幫助

編輯#1

這是適用於您的特定場景的負向後視

\[fn:\d+](?:\\\[|[^[])* 

,並在PHP中,這成爲

if (preg_match('/\[fn:\d+\](?:\\\\\[|[^[])*/', $subject)) { 
    # Successful match 
} else { 
    # Match attempt failed 
} 

的一些注意事項

  • 我用交替,讓它先匹配逃脫[所以它不會被輪換後所匹配排除(常見的技巧依賴於交替的順序)
  • 我從頭開始,所以如果你需要捕獲一些組,然後在需要的地方添加括號
  • 構造(?:)用於分組但不捕獲。這是(可能)更高效,正如我說的,我省略了捕獲

正則表達式針對您的示例進行了測試。讓我知道如果你現在可以得到它

祝你好運,巴克利

+0

我無法設法將其整合到原始模式中。我試過**「{(\ [fn:)([0-9] *)(\])(((?<!\\)\ [)*)}」** and **「{( \ [fn:)([0-9] *)(\])((?<!\\)\ [*)}「** – 2012-03-21 16:38:46

+0

它應該在lookbehind中有四個反斜槓。 PHP的字符串標記器消耗了一個級別的轉義。 – mario 2012-03-21 16:50:24

+0

@mario你能幫我解決嗎。我仍然無法弄清楚這個問題 – 2012-03-21 17:54:27

0

preg_replace_all("#\\[(?!fn:\\d+\\])#", "\\[")會做的伎倆,但最好不要爲此使用正則表達式。