2017-03-17 9 views
1

私は[secret]タグでBBコードを作成しようとしています。 BBコードは、ユーザーレベルに基づいてテキストを「変更」します。しかし、私は正しく動作するように問題を抱えています。preg_replaceとstr_replaceは一緒に使用できないようです

私の現在のコードは次のとおりです。

$replace = array(" ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"); 
    $text = preg_replace('#\[secret\](.*?)\[/secret\]#si', '\1', str_replace($replace, "█", $text)); 

それはユーザーレバー用出力:

█████[██████]███████████.[/██████]█████ 

これのほとんどは正しいです、しかし、それはないですBBタグと他のすべてを投入編集されると仮定する。

私はpreg_replaceとstr_replaceの順序を移動し、正しく動作させることができません。

+1

あなたは 'ブロックアメージング – miken32

答えて

1

コメントで述べたように、タグを正規表現の一致に渡す前に、タグをブロックに置き換えています。このような何かがトリックを行う必要があります。 preg_replace_callback()preg_replace()とほとんど同じですが、文字列を置き換えるものを言う関数を使用します。

<?php 
$string = "Here is a secret: [secret]foo bar baz[/secret]"; 
$result = preg_replace_callback("/\[secret\](.*?)\[\/secret\]/si", function($matches) { 
    return preg_replace("/[\w ]/i", "&#9608;", $matches[1]); 
}, $string); 
echo $result; 

あなたは複数のステップにそれを打破する場合は、元のコードの問題を見ることができます:

<?php 
$replace = array(" ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"); 
$redacted = str_replace($replace, "&#9608;", $text); 
// Clearly, the string "secret" is gone by now, so the regex will never match 
$text = preg_replace('#\[secret\](.*?)\[/secret\]#si', '\1', $redacted); 
+0

でsecret'単語を置き換えているためです。私はpreg_replace_callbackをもっと見直す必要がある、魔法のことをすることができるようだ。 – Carl

関連する問題