RegEx:计数字符

时间:2011-08-08 13:18:07

标签: php regex dokuwiki

我正在编写一个PHP脚本,用于搜索dokuWiki文档中的特定标题。

我目前的模式如下:

$pattern = "/.*=+ ". $header ." =+([^=]+)/m";
preg_match($pattern, $art->text, $m);
if (!empty($m[1])) {
   $art->text = $m[1];
} else {
   $art->text = "";
}

示例文档:

====== TestHeader ======
Testtext

===== Header2 =====
Testtext2

==== Header3 ====
Testtext3

====== Header4 ======
Testtext4

搜索TestHeader时,我的结果是AS-IS:

====== TestHeader ======
Testtext

我希望模式返回:

====== TestHeader ======
Testtext

===== Header2 =====
Testtext2

==== Header3 ====
Testtext3

或换句话说:我想匹配所有被less包围的标题=然后是我正在搜索的标题。

正则表达式是否可以这样?

提前致谢!

2 个答案:

答案 0 :(得分:4)

由于我不是一个优秀的PHP编码器,我不知道是否有任何特殊的PHP扩展“正常”正则表达式允许你想要的东西。除此之外,正则表达式不可能解决您的问题。

如果你感兴趣的话,背后有一些信息理论:regexps只能分析所谓的“常规语言”(参见相应的Wikipedia article)。如果没有深入理论,我可以给你直觉,即正则表达式不能“计算”事物(至少在他们可以比较匹配中的两个计数的意义上)。 重述WP示例:无论N是什么,您都找不到具有N a的字符串,后跟N b。

当然,这并不是数学证明,你所寻找的东西是不可能的,但它应该让你对正则表达式可以做什么和不能做什么感觉。 HTH

答案 1 :(得分:1)

您可以分几步完成:

  • 使用您所拥有的代码找到您正在寻找的标题。
  • 计算该标题中的='。
  • 搜索包含多少个='s
  • 的所有标题

假设您知道在标题中找到$ n或更少=字符:

$pattern = "/.*={1,$n} ". $header ." ={1,$n}([^=]+)/m";

虽然您必须使用两个正则表达式并进行一些处理,但它应该非常快,第二个正则表达式将完全符合您的要求。