preg_match表现得很奇怪

时间:2013-05-09 23:18:18

标签: php regex preg-replace

我正在使用preg_match()从变量中提取文本片段,让我们说变量看起来像这样:

[htmlcode]This is supposed to be displayed[/htmlcode]

middle text

[htmlcode]This is also supposed to be displayed[/htmlcode]

我想提取[htmlcode]的内容并将它们输入到数组中。我这样做是通过使用preg_match()

preg_match('/\[htmlcode\]([^\"]*)\[\/htmlcode\]/ms', $text, $matches);
foreach($matches as $value){
return $value . "<br />";
}

以上代码输出

[htmlcode]This is supposed to be displayed[/htmlcode]middle text[htmlcode]This is also supposed to be displayed[/htmlcode]

而不是

  1. [htmlcode]应该显示[/ htmlcode]
  2. [htmlcode]这也应该显示[/ htmlcode]
  3. 如果已经完全没有想法

4 个答案:

答案 0 :(得分:4)

已经解释过; *模式很贪婪。另一件事是使用preg_match_all()函数。它会返回一个匹配内容的多维数组。

preg_match_all('#\[htmlcode\]([^\"]*?)\[/htmlcode\]#ms', $text, $matches);
foreach( $matches[1] as $value ) {

你会得到这个:http://codepad.viper-7.com/z2GuSd

答案 1 :(得分:3)

*石斑鱼是贪婪的,即它会吃掉所有东西,直到最后 [/htmlcode]。尝试用非贪婪的*替换*?

答案 2 :(得分:2)

*默认为贪婪,([^\"]*?)(注意添加的?)应该让它变得懒惰。

答案 3 :(得分:2)

看看这段代码:

preg_match('/\[htmlcode\]([^\"]*)\[\/htmlcode\]/ms', $text, $matches);
foreach($matches as $value){
return $value . "<br />";
}

现在,如果您的模式工作正常并且一切正常,您应该知道:

  • return语句将中断所有循环并退出该函数。
  • 匹配中的第一个元素是整个匹配,整个字符串。在您的情况下$text

所以,你所做的是返回第一个大字符串并退出函数。

我建议您检查所需的结果:

$matches[1]$matches[2]