2012-03-04 17 views
1

私は今何度もpreg_の関数を使って遊んでいます。私は文字列の部分を取り除こうとしましたが、私はそれらを取り出して一緒に戻してみました。配列に含まれていないものをすべて削除してください

私は許可された文字またはセグメントの配列を持っています。この配列にない文字列から何かを削除したいだけです。どのように私は文字列の構造を台無しにすることなくこれを行うことができますか?

これは、私はそれを行うことを期待するものです。

$allowed = array('<', '>', 'p', 'sc'); 
echo clean('<script>'); // <scp> 

ボーナス質問:私はUTF-8がaswell動作することを確認するためにmb_ereg_matchを使用する必要がありますか?

ありがとうございます。

答えて

3

文字セット以外のすべてを削除する場合は、[^a-c]などの小文字の文字を使用して簡単に行うことができます。a, b, c以外はすべて一致します。文字列(あなたのscのような)の場合、これはもちろん動作しません。

しかし、どの文字を保存したいのか分かっていれば、ゲームを回すことができます。あなたが残しておきたいものを抽出し、残りの部分を無視:

<?php 
$text = 'hello <script> |world #/foo'; 

$allowed = array('<', '>', 'p', 'sc', '|', '#'); 
array_walk($allowed, function(&$value){ 
    $value = preg_quote($value, '#'); 
}); 
$pattern = '#' . join('|', $allowed) . '#iu'; 

$text = preg_match_all($pattern, $text, $matches); 
$text = join('', $matches[0]); 
echo $text, "\n"; 

ボーナス質問:私はUTF-8がaswell動作することを確認するためにmb_ereg_matchを使用する必要がありますか?

PCREは、/uフラグを使用してUTF-8を実行できます。 mb_ereg_ *は、後者が

foreach ($allowed as &$value) { 
    $value = preg_quote($value, '#'); 
}; 

ある が

array_walk($allowed, function(&$value){ 
    $value = preg_quote($value, '#'); 
}); 

ちょうど同様かもしれPCREよりも遅いとUTF-8


ISO-8859-1以外の文字セットを扱うときにのみ使用してくださいおそらく少し速い...

+0

すばらしい答え!これはまさに私が探していたものでしたが、角括弧を作るために少し修正を加える必要がありました。また、ほんの数週間前にボーナスの質問に対するあなたの答えについての部分を読んで、それがどれほど素早く忘れられるのか疑問に思っています;) – Seralize

+0

'preg_quote'を' array_walk($ allowed、 'preg_quote') ' 'array_walk'は値を最初に、キーは第2のパラメータとして渡しますが、' preg_quote'は第2引数を区切り文字とみなします。 – Gumbo

+0

あなたは完全に@Gumboです。私は例を更新しました。 – rodneyrehm

関連する問題