2010-05-20 75 views
3

我在PHP中使用preg_ *來搜索模式<!-- %{data=THIS GETS MATCHED}% -->並拉出匹配的文本。PHP的正則表達式來搜索多個行

模式因爲這是:

preg_match('#<!-- %{' . $knownString . '\s*=\s*(.*?)}% -->#', ...) 

我想它做的是跨多行的字符串搜索。例如:

<!-- %{data= 
THIS GETS 
MATCHED AND 
RETURNED 
}% --> 

如何編輯我的當前模式以具備此搜索能力?

回答

1

preg_match('#<!-- %{' . $knownString . '\s*=\s*(.*?)}% -->#s', ...)是否工作?

我沒有PHP在這裏工作的ATM,所以我不能測試它...

+0

我設法通過使用'/ <! - %{'來實現它。 $ knownString。 '= \ s *(。*?)}% - >/s'。然而,在正則表達式中我很糟糕,所以如果你看着那個想法「......大聲笑?」。請告訴我xD – dave 2010-05-20 06:49:35

+0

對我來說似乎很好:) – 2010-05-20 06:56:56

6

您應該加上「S」 pattern modifier,沒有它,點匹配任何字符除了爲換行符:

preg_match('#<!-- %{' . $knownString . '\s*=\s*(.*?)}% -->#s', ...) 
+1

在將它粘貼到正則表達式的其餘部分之前,我會用preg_quote()來確保$ knownString的安全。 – 2010-05-20 21:26:59

1

這似乎工作:

<?php 
    $testString = "<!-- %{data= 
THIS GETS 
MATCHED AND 
RETURNED 
}% -->"; 
    $knownString = "data"; 
    preg_match("@<!-- %\\{" . $knownString . "\\s*=\\s*([^\\}]+)\\}% -->@", $testString, $match); 
    var_dump($match); 
?> 

返回:

array(2) { 
    [0]=> 
    string(54) "<!-- %{data= 
THIS GETS 
MATCHED AND 
RETURNED 
}% -->" 
    [1]=> 
    string(34) "THIS GETS 
MATCHED AND 
RETURNED 
" 
} 
+0

'm'或多行模式改變了'^'和'$'錨點的含義,使它們能夠在行邊界以及字符串的開始和結尾進行匹配。你的正則表達式的工作原理是因爲你把點改成了'([^ \\}]';'m'是無關緊要的 – 2010-05-20 13:43:15

+0

你是對的,我修改了代碼。 – 2010-05-20 13:51:33