【问题标题】:Regular expression to match all content between 2 tags正则表达式匹配两个标签之间的所有内容
【发布时间】:2010-10-28 23:42:26
【问题描述】:

我正在尝试使用正则表达式在 PHP 中捕获以下内容:

/*

名称:测试

描述:我的测试

*/

我已经尝试过这里的代码:Match everything inbetween two tags with Regular Expressions?,但它没有捕获新行。

编辑:我使用了以下常规,它在单行上工作,但一旦看到换行符就会停止工作

EDIT2:我想包括我在一大段有很多换行符的文本上运行这个脚本。我确定我们需要使用 *,因为我不确定换行符出现的次数。

/*(.*?)*/

TIA

【问题讨论】:

  • 显示你使用的正则表达式。另外,您的意思是使用 /* 注释 */ thingys 作为锚点来捕获吗?
  • @mario 感谢您的指出。我已经编辑了我的原始帖子。是的,我想用它们作为锚

标签: php regex


【解决方案1】:

嗯,好的。默认情况下,正则表达式中的点 . 不匹配换行符。您需要 /s 修饰符(在正则表达式结束后):

 preg_match("#/[*](.*?)[*]/#s", ...

另见上文,您需要转义 *(使用反斜杠或围绕 []),如果您想匹配 /,您还需要另一个字符将其括起来。我使用 # 而不是/

如有疑问,请始终添加/ims。当您不使用 ^ $. 和字母时,不会导致性能下降。

【讨论】:

  • 你不是说\/[*](.*?)[*]\/吗?
  • 非常感谢。它似乎工作。我想知道,#是什么?此外,我似乎无法在您提到的 /ims 上找到任何文档 - 它是 PHP 的吗?
  • "#" 等价于 "/"。您可以使用 ANY 字符将正则表达式括在其中。 #ims 或 /ims 只是 /i (不区分大小写)和 /m (用于多行匹配)和 /s (用于捕获带点的换行符)的组合。这是一个很难的话题,所以我建议regular-expressions.info,它对 PHP preg_match 也有很好的介绍。
  • @Alec:不,它可以工作而不会在这里转义。这就是我使用 # 个附件的原因。仅当您想使用常规斜线封闭样式 /.../i 时,您必须转义斜线。
  • 非常感谢马里奥!今天学到了一些新东西
【解决方案2】:

使用标志s(s代表dotall)

/*(.*?)*/s

这个标志让点也匹配换行符(没有这个标志就不会)

【讨论】:

猜你喜欢
  • 2013-10-31
  • 2010-09-22
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
相关资源
最近更新 更多