2017-01-27 23 views
2

私はのBBCodeスタイルフォームからHTMLタグを取得するためにPHP関数を作成しようとしています。事実、私はpreg_replaceでかなり簡単にタグを取得できました。私は同じBBコード内のBBコードを持っている場合しかし、私はこのように...preg_replace:BBCodeから他のhtmlタグ内にhtmlタグを取得する

をいくつかのトラブルを持っている:だから

[blue]My [black]house is [blue]very[/blue] beautiful[/black] today[/blue] 

、私はそれを「解析」するとき、私は常に持っている青色のもののためにBBコードのまま。次のようなものがあります。

My house is [blue]very[/blue] beautiful today 

最初の青色タグ内の黒色タグ内の青色タグを除いてすべてが着色されています。

どうしたらいいですか?より多くの情報と

は、私が試した:

Regex: "/\[blue\](.*)\[\/blue\]/si" or "/\[blue\](.*)\[\/blue\]/i" 
Getting : "My house is [blue]very[/blue] beautiful today" 

Regex : "/\[blue\](.*?)\[\/blue\]/si" or "/\[blue\](.*)\[\/blue\]/Ui" 
Getting : "My house is [blue]very beautiful today[/blue]" 

は、私がループするにpreg_replaceを持っていますか?それを行う方法はありません正規表現のスタイル、ものをループせずに?

Thx :)

+0

「php bbcode library」の検索をおすすめしたい場所です。それをHTMLに解析し、適切なDOM処理ツールを使用して処理します。車輪を改造しないでください。 – miken32

+0

さらにお気軽にご明記いただけますか?あなたが理解できる限り、BBCodeタグをhtmlタグに置き換えていますか? –

+0

@UmurKaragözまさに。それはbbcodeから始まり、私はhtmlタグでそれをしたい! miken32あなたは正しいですが、私は好奇心が強いですが、どうすればいいのか知りたいのですが: – Vae

答えて

1

あなたは製品にホイールを再開発して、よくテストされたプラグインを選んではいけません。しかし、あなたがペットプロジェクトを試している、またはペットプロジェクトで作業しているなら、ぜひ試してみてください。楽しんで、その過程で重要な知識を得ることができます。

これで正規表現に従ってみることができます。私はあなたのためにそれを下に分解します。

(\[(.*?)\])(.*?)(\[/\2\])

理念

このようなマークアップを解析中に、あなたが実際に求めていることは彼らのペアとマッチタグにあります。

したがって、ループを実行し、の度に最も外側のタグペアをキャプチャして置き換えると、が発生する可能性があります。

上記の正規表現では、のキャプチャグループは次の情報を提供します。開閉タグだから、タグ[/blue]

を閉じるMy [black]house is [blue]very[/blue] beautiful[/black] today

    1. オープニングタグ(完了)[black]
    2. オープニングタグ(タグ名)black
    3. コンテンツ、あなたは$ 2を使用することができます処理しているタグを特定し、それを

      <tag>$3</tag> 
      // or even 
      <$2>$3</$2> 
      

      これはあなたに与えるでしょう。 mentionned他人として

      // in first iteration 
      <tag>My [black]house is [blue]very[/blue] beautiful[/black] today</tag> 
      
      // in second iteration 
      <tag>My <tag2>house is [blue]very[/blue] beautiful</tag2> today</tag> 
      
      // in third iteration 
      <tag>My <tag2>house is <tag3>very</tag3> beautiful</tag2> today</tag> 
      

      コード

      $text = "[blue]My [black]house is [blue]very[/blue] beautiful[/black] today[/blue]"; 
      
      function convert($input) 
      { 
          $control = $input; 
      
          while (true) { 
           $input = preg_replace('~(\[(.*?)\])(.*)(\[/\2\])~s', '<$2>$3</$2>', $input); 
      
           if ($control == $input) { 
            break; 
           } 
      
           $control = $input; 
          } 
      
          return $input; 
      } 
      
      
      echo convert($text); 
      
  • +0

    いいです...私は見てみましょう。あなたの助けのためのThx :)しかし、実際には、ループを使用してあなたのase ...それはすべてのpaternsとremplacementsをループするだけで簡単にはありませんか?このループは長時間続く可能性がありますか、何か不足していますか? – Vae

    +0

    この問題を解決するには、再帰的処理が唯一の方法です。したがって、どちらの場合でも反復が行われます。あなたは場面の裏にしか置くことができません。 私はいくつかのコードサンプルを追加しました。あなたがそれをテストする場合は私に知らせてください、それが良いパフォーマンスで動作するかどうか聞いてみたいと思います。 –

    +0

    ニースのコード、私はちょうどそれをテストしました:それはかなりうまくいくようです。しかし、私はすべてのBBcodeの "タグ"をhtmlタグで置き換えることはしません([thing]はに置き換えてはいけません)...だから、私は$パターン$置換を使うことができますか?私はちょうどpreg_replace_callbackのことを見ていますが、人々は "BBcodeのために使用しないでください"と言います... ... ^^ – Vae

    0

    、車輪の再発明をしようとしないでください。
    しかし、あなたは再帰アプローチ使用することができます:ここで

    <?php 
    
    $text = "[blue]My [black]house is [blue]very[/blue] beautiful[/black] today[/blue]"; 
    
    $regex = '~(\[ ((?>[^\[\]]+) | (?R))* \])~x'; 
    
    $replacements = array( "blue" => "<bleu>", 
             "black" => "<noir>", 
             "/blue" => "</bleu>", 
             "/black" => "</noir>"); 
    
    $text = preg_replace_callback($regex, 
        function($match) use ($replacements) { 
         return $replacements[$match[2]]; 
        }, 
        $text); 
    
    echo $text; 
    # <bleu>My <noir>house is <bleu>very</bleu> beautiful</noir> today</bleu> 
    
    ?> 
    

    、すべての色のタグはフランス語で置き換えられるの対応、a demo on ideone.comを参照してください(ちょうどそれを作りました)。再帰パターンの詳細については、対象のPHP documentationをご覧ください。

    +0

    これらの情報のために多くのThx。私はそれを見てみましょう! – Vae

    関連する問題