【问题标题】:PHP RegularExpression : match anything (including whitespaces)PHP RegularExpression:匹配任何内容(包括空格)
【发布时间】:2009-12-09 05:37:43
【问题描述】:
text text text
text text text

{test}
    content
    content
    content
{/test}

text text text
text text text

我需要从上面的字符串中得到两个单独的结果:
1.

{test}
    content
    content
    content
{/test}

2.

    content
    content
    content

那么,对于 PHP 来说,两个独立的正则表达式模式应该是什么才能得到上述两个结果

【问题讨论】:

  • 建议:放下手头的工作,学习如何使用正则表达式。他们会让你的余生非常快乐。
  • 您可以通过一次调用 preg_match() 来匹配两者;不需要使用两个不同的正则表达式,这意味着调用 preg_match() 两次。

标签: php pattern-matching preg-match preg-match-all


【解决方案1】:

这样的事情怎么样:

$str = <<<STR
text text text
text text text

{test}
    content
    content
    content
{/test}

text text text
text text text
STR;

$m = array();
if (preg_match('#\{([a-zA-Z]+)\}(.*?)\{/\1\}#ism', $str, $m)) {
    var_dump($m);
}

哪个会得到这种输出:

array
  0 => string '{test}
    content
    content
    content
{/test}' (length=50)
  1 => string 'test' (length=4)
  2 => string '
    content
    content
    content
' (length=37)

所以,在$m[0] 中你有整个匹配的字符串(即标签+内容),而在$m[2] 你只需要标签之间的内容。

注意我使用的是“通用”标签,而不是专门的“test”;如果你只有“test”标签,你可以改变它。

有关更多信息,您至少可以看一下:

【讨论】:

  • 哦,对不起,我用 [.*?] 而不是 (.*?) 那是我的错!但是,感谢您的好评!请你解释一下这个词{/\1}
  • \1 是对匹配的第一个模式的“反向引用”;这里的想法是结束标签应该对应于开始标签;;更多信息,您可以阅读:php.net/manual/en/regexp.reference.back-references.php
【解决方案2】:

将标签和内容一起捕获:

/(\{test\}[^\x00]*?\{\/test\})/

仅捕获内容:

/\{test\}([^\x00]*?)\{\/test\}/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2012-01-21
    • 2020-02-01
    • 1970-01-01
    相关资源
    最近更新 更多