2011-08-08 10 views
1

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

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

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

サンプル文書:TestHeader用AS-IS、私の結果を検索する場合

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

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

==== Header3 ==== 
Testtext3 

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

は次のとおりです。

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

私が望むだろうパターンが返されること:

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

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

==== Header3 ==== 
Testtext3 

つまり、以下のように囲まれたすべてのヘッダーに一致するようにしたいと考えています。

正規表現でこれが可能ですか?

ありがとうございます!

答えて

4

私は偉大なPHPコーダーではないので、あなたが望むものを許可する "普通の"正規表現への特別なPHP拡張があるかどうかわかりません。それ以外に、正規表現はあなたの問題を解決することはできません。

興味深い場合に備えて、正規表現ではいわゆる「通常の言語」(対応するWikipedia articleを参照)のみを分析できます。理論に過度に浸ることなく、正規表現が(少なくとも2つのカウントをマッチ内で比較できるという意味ではない)ものを「数え」ないという直感をあなたに与えることができます。 WPの例を言い換えると、Nが何であっても、N aの後にN bが続く文字列を見つけることができません。

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

1

あなたはカップルの段階でそれを行うことができます。

  • は、あなたが探しているヘッダを見つけるために持っているコードを使用してください。
  • そのヘッダーの=を数えます。
  • 多くのまたはより少ない= 'sの

はあなたが$ nまたはヘッダ内の少ない=文字を探していた知っていたと仮定して、すべてのヘッダーを検索:

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

あなたが持っていると思いますが、 2つの正規表現を使用して少し処理を行うには、かなり速くなければならず、2番目の正規表現はあなたが求めているものとまったく同じです。

関連する問題