1

我正在编写一个 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 = 包围的标题然后是我正在搜索的标题。

使用正则表达式可以实现这样的事情吗?

提前致谢!

4

2 回答 2

4

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

这背后有一些信息论,如果您感兴趣的话:正则表达式只能分析所谓的“常规语言”(请参阅​​相应的Wikipedia 文章)。在不深入理论的情况下,我可以直观地告诉您正则表达式不能“计数”事物(至少在它们可以比较匹配中的两个计数的意义上)。重述 WP 示例:无论 N 是什么,您都找不到包含 N a 后跟 N b 的字符串。

当然,这并不能证明您所寻找的东西是不可能的,但它应该让您了解正则表达式可以做什么和不能做什么。高温高压

于 2011-08-08T13:27:46.080 回答
1

您可以通过几个步骤来完成:

  • 使用您必须找到的代码来查找您要查找的标题。
  • 计算该标题中的=。
  • 搜索具有那么多或更少 = 的所有标题

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

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

尽管您必须使用两个正则表达式并进行一些处理,但它应该很快,并且第二个正则表达式将完全按照您的要求进行。

于 2011-08-08T13:28:46.540 回答