filter_var_array関数を使用して、az 文字を除くすべての文字を配列値から削除しようとしています。
複数のフィルターを適用しようとしましたが、残念ながらどれもうまくいきませんでした。この関数を使用してこれを行う他の方法はありますか、またはこれを行うために foreach ループで正規表現のようなものを使用する必要がありますか?
filter_var_array関数を使用して、az 文字を除くすべての文字を配列値から削除しようとしています。
複数のフィルターを適用しようとしましたが、残念ながらどれもうまくいきませんでした。この関数を使用してこれを行う他の方法はありますか、またはこれを行うために foreach ループで正規表現のようなものを使用する必要がありますか?
$f = function ($string) { return preg_replace('~[^a-z]~i', '', $string); };
$myValues = array_map($f, $myValues);
preg_replace()
配列ではすでに非常に自然に機能します。これにより、文字列の配列からすべての非アルファが削除されます。
$array = preg_replace('/[^a-z]/i', '', $array);
例:
$a = array('1111A55b999c0000','111111def9999999','0000000g88888hi8888888');
$a = preg_replace('/[^a-z]/i', '', $a);
assert($a == array('Abc','def','ghi'));
大文字と小文字を区別しないことが必要な場合があると思います。本当に大文字も削除したい場合は、i
.
array_map
個人的には正規表現を使用します。
$array = Array("abc123", "123jkl", "abc123def");
$array = array_map("preg_replace",
array_fill(0, count($array), '/[^a-z]*/'),
array_fill(0, count($array), ''),
$array );
他の回答と同様に、これも正規表現の習得に基づいています。これは、基本的に、これらすべてのバリデーターが構築されている基本的な文字スキャン(および解析)手法です。バリデーター/フィルターに関する考え方は、可能な限り多くの妥当なクラスの文字列(regexps)を定義/推測/カバーすることです。(さらに、[0-9]*や[az]*のような些細なクラスの最適化が高速化されます-標準のperl互換を経由する必要はありません)
簡単に言うと、確かに、FILTER_VALIDATE_REGEXPのようなものは私にとっても機能しませんでした...
filter_var_array&co。は比較的新しい方法ですが、次の形式で機能するカスタム FILTER_CALLBACKにフォールバックする必要がある場合は次のようになります。
<?php
error_reporting(E_ALL | E_STRICT);
function handle($value) {
return preg_replace('/[^a-z]/', '', $value);
}
$data = array(
'testfield' => array('22', 'foo', 'bar', '42'),
);
$args = array(
'testfield' => array('filter' => FILTER_CALLBACK,
'options' => 'handle'
),
);
$result = filter_var_array($data, $args);
var_dump($result);
と生成します
array(1) {
["testfield"]=>
array(4) {
[0]=>
string(0) ""
[1]=>
string(3) "foo"
[2]=>
string(3) "bar"
[3]=>
string(0) ""
}
}
おそらくforeachに勝るものはありませんが、それは「別の方法」です。
array_walk($a, function(&$e) {
$e = preg_replace('/[^a-z]/', '', $e);
});
(「クロージャ」とも呼ばれるこの無名関数構文を使用する場合は、PHP 5.3が必要です。)