2013-03-14 127 views
2

我試圖從使用filter_var_array函數的a-z字符除去我的數組值中的所有字符。php使用filter_var_array去除除a-z之外的任何東西

我試過應用多個filters,但不幸的是他們都沒有爲我做的伎倆,是否有任何其他方式來做到這一點使用此功能,或者我不得不在foreach循環中使用正則表達式這樣做?

+0

你確定你已經嘗試過'FILTER_FLAG_STRIP_HIGH'過濾器嗎? – edwardmp 2013-03-14 00:54:41

+0

建議更明確地說明是否需要區分大小寫。如果是這樣,請提及應刪除大寫字符。如果沒有(這是我懷疑你想要的),那麼應該保留a-z和A-Z。另外假設你想剝離exotics äè &otilde ;.如果你確實想剝離它們,那麼我建議不需要改變,但只是檢查。另外,它是一個令人失望的答案大多數不使用過濾器,因爲你問? – 2013-03-15 12:31:11

回答

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

+0

呵呵,是的,你說得對:D你可以省略'+'。 – KingCrunch 2013-03-14 01:44:49

+0

確實如此,但我猜測+通過刪除非alpha的塊**,而不是單個的**字符**,使它*略微更有效。但只有一個分析器可以肯定地說。 (然而,使用*會在時空連續體中產生裂痕。) – 2013-03-14 01:51:52

+1

這很有趣。我認爲它應該更快_without_'+',因爲它會減少模式匹配本身的一步。我擔心正確的答案是「內部沒有區別(執行路徑除外)」:D – KingCrunch 2013-03-14 01:58:26

-1

也許沒有比的foreach更好,但它是一個「其他方式」:

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

(需要PHP如果你使用這個匿名函數的語法5.3,也被稱爲「封閉」)

+0

匿名函數和閉包是兩個不同的東西。剛纔說:)(實際上,閉包是匿名函數的一個子集)。 – KingCrunch 2013-03-14 01:30:38

+0

真的@KingCrunch?在[匿名函數](http://php.net/manual/en/functions.anonymous.php)和[Closure類]的PHP文檔中(http://www.php.net/manual/en/class .closure.php)我還沒有看到這種區別。你做? – 2013-03-14 01:35:30

+0

區別不是來自PHP:匿名函數是一個沒有名字的函數。閉包是一個匿名函數,帶有對非局部變量的附加引用。嚴格地說,函數foo(){}'是一個匿名函數,'function foo()use($ bar){}'是一個閉包。在PHP中,差異根本無關緊要,因此區別並不重要,但其他語言使用這一事實:函數(而不是閉包)不應該有任何副作用來進行並行化。 – KingCrunch 2013-03-14 01:41:29

1

我個人使用array_map和一個正則表達式。與其他答案這個也是基於掌握regular expressions,這基本上是基本特徵掃描(和解析)技術所有的驗證都在建

 $array = Array("abc123", "123jkl", "abc123def"); 
    $array = array_map("preg_replace", 
         array_fill(0, count($array), '/[^a-z]*/'), 
         array_fill(0, count($array), ''), 
         $array); 
0

掃描==正則表達式

。關於驗證器/過濾器的想法是儘可能多地定義/猜測/覆蓋儘可能多的合理的classes of strings(regexps)。 (加有用於瑣碎類的優化速度像[0-9] *或[AZ] * - 無需通過標準Perl兼容去)

filter_var_array和回調

作爲一個快速備註:的確,像FILTER_VALIDATE_REGEXP沒有爲我工作,要麼...

filter_var_array &合作。是相對較新的做法,但如果你必須然後退回到在following形式的任何自定義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) "" 
    } 
} 
2
$f = function ($string) { return preg_replace('~[^a-z]~i', '', $string); }; 
$myValues = array_map($f, $myValues); 
+0

在PHP中,匿名函數是否存在「垃圾回收」的問題? – 2013-03-14 01:39:40

+0

@YauhenYakimovich你在說什麼?除此之外,這很大程度上取決於你使用的版本,你作爲一個用戶應該永遠不需要關心GC,因爲內置的GC在他的工作上相當不錯:) – KingCrunch 2013-03-14 01:42:56

+0

我記得GC主要是PHP中的引用計數機制。是的 - 匿名函數確實有內存泄漏..只是想知道什麼是目前的狀態(例如使用匿名函數生產代碼) – 2013-03-14 01:50:55

相關問題