2011-08-08 88 views
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 

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

正常表达式可能是这样的可能吗?

在此先感谢!

回答

4

因为我不是一个很好的PHP编码器,我不知道是否有任何特殊的PHP扩展到“正常”的正则表达式,允许你想要什么。除此之外,正则表达式不可能解决您的问题。

有一些背后的信息理论,如果你有兴趣:正则表达式只能分析所谓的“正规语言”(见相应的Wikipedia article)。不要太深入理论,我可以给你直觉,即正则表达式不能“计数”事物(至少不能在比赛中比较两个计数)。 要重申WP示例:无论N是什么,都找不到N a的后跟N b的字符串。

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

1

你可以做一对夫妇的步骤:

  • 使用你已经得到了代码,找到你要找的头。
  • 在该标题中计数=。
  • 搜索所有标题,很多或更少=的

假设你知道你在标题中寻找$ n或更少的字符=:

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

虽然你有要使用两个正则表达式并做一些处理,它应该非常快,第二个正则表达式可以完全按照您的要求进行操作。