2016-06-25 11 views
1

内の関連するセクションにファイルが私はこれはPHPのフォームを介してユーザがアップロードすることをconfig.confファイルにあるビットこの分割PHP

Blah 
Diddel 
Foo 
Bar1 
Bar2 
One 
XXY 
Password%1 = something 
Password%2 = other 
Password%3 = nuffing 
Completely different stuff here 
RandomS6}=2 
User%1 = Henry 
User%2 = Marcus 
User%3 = SecretAdmin 
More stuff 
Even more stuff 
Loads of stuff 

のように見える設定ファイルを持っています。

  • XXY
  • すべての「パスワードの%を...」まで、最初からすべての行

    1. とラインを含む行を:私はそのファイルを読み込み、次のようにそれのうち5つの新しいファイルを作成したいです最後の「パスワード...」と最初の間
    2. ライン「ユーザー...」行
    3. すべての「ユーザー...」
    4. すべての下のライン「ユーザー...」行

    は今、私が扱うことができるマッチする文字列、正規表現は甘いだろうが、それは、厳格な形式の設定であるように私は私の周り私の頭を取得することはできませんどのような

    while (substr($line,0,5) == "Passw" { ...

    でそれをbodgeすることができ、構造的な方法です。 私はネストされたif-loopで始めましたが、それはまったく非効率的でした( 'User ...'ブロックの後のすべての行はまだ 'Password ...'のテストを受けています)、b)muddlyに見えるだけでなくデバッグする悪夢でもあります。

    これを行うための巧妙な方法があるに違いありませんか?私が扱うカードのようにそれを想像する - 「デッキで始まり、チャックカードをこの山に起こり、その後、別の山にチャックカード 『Y』のなどが起こるまで、 『X』まで」私はそれのまわりで私の頭を取得するには、プログラマの十分ではありませんよ。

    私はかなりの量のグーグルを行っていますが、カンマで分割する方法や、行数で分割する方法を教えてもらえますが、意味的に分割するチュートリアルはありません。

    任意のヒントのためのほとんどの感謝!

    P.S. - 多くの方が適している役割に何かがある場合はPHPである必要はありません。しかし、私はRubyの初心者であり、Pythonの赤ちゃんです.PHPは私が何か他のものよりも少し良く知っているものです。

    +0

    あなたが記述した "取引カード"アルゴリズムは、 'itertools'を使って簡単にPythonで実装することができます。 *(他の言語でもそれほど複雑ではない)*。 –

    +0

    itertoolsがブックマークされました。この作業では学習曲線が急峻すぎますが、時間をかけて投資する価値があるようです。ありがとうございました! – sheepsky

    答えて

    0

    私が選んだのアプローチは、4つのステップでsectionizingん:

    1. マッチ.conf変数/区切り文字を知られており、それらを(パスワードは、 ユーザー、XXY)
    2. 何もマッチした文字列を置き換えます(省略して)
    3. 保存します
    4. 分割新しく変更されたセクションに文字列
    5. マージ(1)及び(3)
    ここ

    はコードです:

    $matches = []; 
    $string = preg_replace_callback(
         '~^(?>User.+|Password.+|XXY)$~m', 
         function ($match) use (&$matches) { 
          @$matches[substr($match[0], 0, 4)] .= $match[0]; 
          return null; 
         }, 
         $input 
        ); 
    
    print_r(array_merge($matches, preg_split('/^\s+$/m', $string))); 
    

    結果は完全に(それをやるべき仕事ビット以上)のために少し厄介とではありませんが、あなたは(Live demo)欲しいものを持っている:

    Array 
    (
        [XXY] => XXY 
    
        [Pass] => Password%1 = something 
    Password%2 = other 
    Password%3 = nuffing 
    
        [User] => User%1 = Henry 
    User%2 = Marcus 
    User%3 = SecretAdmin 
    
        [0] => Blah 
    Diddel 
    Foo 
    Bar1 
    Bar2 
    One 
    
        [1] => 
    Completely different stuff here 
    RandomS6}=2 
    
        [2] => 
    More stuff 
    Even more stuff 
    Loads of stuff 
    ) 
    
    +0

    おっと、それは素晴らしいです!どうもありがとう! – sheepsky

    +0

    ようこそ。これがあなたの質問に答えた場合は、チェックマークアイコンをクリックして、それを受け入れたとマークすることができます。 @シェフスキー – revo

    +0

    はそれを見つけるために私をしばらく捉えました。再度、感謝します! – sheepsky