我正在编写一个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包围的标题=然后是我正在搜索的标题。
正则表达式是否可以这样?
提前致谢!
答案 0 :(得分:4)
由于我不是一个优秀的PHP编码器,我不知道是否有任何特殊的PHP扩展“正常”正则表达式允许你想要的东西。除此之外,正则表达式不可能解决您的问题。
如果你感兴趣的话,背后有一些信息理论:regexps只能分析所谓的“常规语言”(参见相应的Wikipedia article)。如果没有深入理论,我可以给你直觉,即正则表达式不能“计算”事物(至少在他们可以比较匹配中的两个计数的意义上)。 重述WP示例:无论N是什么,您都找不到具有N a的字符串,后跟N b。
当然,这并不是数学证明,你所寻找的东西是不可能的,但它应该让你对正则表达式可以做什么和不能做什么感觉。 HTH
答案 1 :(得分:1)
您可以分几步完成:
假设您知道在标题中找到$ n或更少=字符:
$pattern = "/.*={1,$n} ". $header ." ={1,$n}([^=]+)/m";
虽然您必须使用两个正则表达式并进行一些处理,但它应该非常快,第二个正则表达式将完全符合您的要求。