2010-05-20 66 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