1

私は、dokuWiki ドキュメント内の特定の見出しを検索する PHP スクリプトを作成しています。

私の現在のパターンは次のようになります。

$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 拡張機能を使用して、必要なものを実現できるかどうかはわかりません。それ以外では、正規表現は問題を解決できない可能性があります。

興味がある場合は、その背後にいくつかの情報理論があります。正規表現は、いわゆる「正規言語」のみを分析できます (対応するウィキペディアの記事を参照してください)。理論に深く入り込むことなく、正規表現は物事を「カウント」できないという直感を与えることができます (少なくとも、マッチ内の 2 つのカウントを比較できるという意味では)。WP の例を言い換えると、N が何であれ、N a の後に N b が続く文字列を見つけることはできません。

もちろん、これは探していることが不可能であるという数学的証明ではありませんが、正規表現でできることとできないことについての感覚をつかむことができます。HTH

于 2011-08-08T13:27:46.080 に答える
1

いくつかのステップでそれを行うことができます:

  • 探しているヘッダーを見つけるために持っているコードを使用してください。
  • そのヘッダーの = を数えます。
  • その数または少ない = を持つすべてのヘッダーを検索します

ヘッダーで $n 以下の = 文字を探していることがわかっているとします。

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

2 つの正規表現を使用して少し処理を行う必要がありますが、処理は非常に高速であり、2 番目の正規表現はまさにあなたが求めていることを実行します。

于 2011-08-08T13:28:46.540 に答える