2

filter_var_array関数を使用して、az 文字を除くすべての文字を配列値から削除しようとしています。

複数のフィルターを適用しようとしましたが、残念ながらどれもうまくいきませんでした。この関数を使用してこれを行う他の方法はありますか、またはこれを行うために foreach ループで正規表現のようなものを使用する必要がありますか?

4

5 に答える 5

2
$f = function ($string) { return preg_replace('~[^a-z]~i', '', $string); };
$myValues = array_map($f, $myValues);
于 2013-03-14T01:27:02.270 に答える
2

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.

于 2013-03-14T01:41:25.457 に答える
1

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 );
于 2013-03-14T01:06:51.663 に答える
0

スキャン==正規表現

他の回答と同様に、これも正規表現の習得に基づいています。これは、基本的に、これらすべてのバリデーターが構築されている基本的な文字スキャン(および解析)手法です。バリデーター/フィルターに関する考え方は、可能な限り多くの妥当なクラスの文字列(regexps)を定義/推測/カバーすることです。(さらに、[0-9]*や[az]*のような些細なクラスの最適化が高速化されます-標準のperl互換を経由する必要はありません)

filter_var_arrayとコールバック

簡単に言うと、確かに、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) ""
  }
}
于 2013-03-14T01:22:28.187 に答える
-1

おそらくforeachに勝るものはありませんが、それは「別の方法」です。

array_walk($a, function(&$e) {
    $e = preg_replace('/[^a-z]/', '', $e);
});

(「クロージャ」とも呼ばれるこの無名関数構文を使用する場合は、PHP 5.3が必要です。)

于 2013-03-14T01:02:32.633 に答える