我試圖從使用filter_var_array函數的a-z字符除去我的數組值中的所有字符。php使用filter_var_array去除除a-z之外的任何東西
我試過應用多個filters,但不幸的是他們都沒有爲我做的伎倆,是否有任何其他方式來做到這一點使用此功能,或者我不得不在foreach循環中使用正則表達式這樣做?
我試圖從使用filter_var_array函數的a-z字符除去我的數組值中的所有字符。php使用filter_var_array去除除a-z之外的任何東西
我試過應用多個filters,但不幸的是他們都沒有爲我做的伎倆,是否有任何其他方式來做到這一點使用此功能,或者我不得不在foreach循環中使用正則表達式這樣做?
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
。
呵呵,是的,你說得對:D你可以省略'+'。 – KingCrunch 2013-03-14 01:44:49
確實如此,但我猜測+通過刪除非alpha的塊**,而不是單個的**字符**,使它*略微更有效。但只有一個分析器可以肯定地說。 (然而,使用*會在時空連續體中產生裂痕。) – 2013-03-14 01:51:52
這很有趣。我認爲它應該更快_without_'+',因爲它會減少模式匹配本身的一步。我擔心正確的答案是「內部沒有區別(執行路徑除外)」:D – KingCrunch 2013-03-14 01:58:26
也許沒有比的foreach更好,但它是一個「其他方式」:
array_walk($a, function(&$e) {
$e = preg_replace('/[^a-z]/', '', $e);
});
(需要PHP如果你使用這個匿名函數的語法5.3,也被稱爲「封閉」)
匿名函數和閉包是兩個不同的東西。剛纔說:)(實際上,閉包是匿名函數的一個子集)。 – KingCrunch 2013-03-14 01:30:38
真的@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
區別不是來自PHP:匿名函數是一個沒有名字的函數。閉包是一個匿名函數,帶有對非局部變量的附加引用。嚴格地說,函數foo(){}'是一個匿名函數,'function foo()use($ bar){}'是一個閉包。在PHP中,差異根本無關緊要,因此區別並不重要,但其他語言使用這一事實:函數(而不是閉包)不應該有任何副作用來進行並行化。 – KingCrunch 2013-03-14 01:41:29
我個人使用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);
。關於驗證器/過濾器的想法是儘可能多地定義/猜測/覆蓋儘可能多的合理的classes of strings(regexps)。 (加有用於瑣碎類的優化速度像[0-9] *或[AZ] * - 無需通過標準Perl兼容去)
作爲一個快速備註:的確,像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) ""
}
}
$f = function ($string) { return preg_replace('~[^a-z]~i', '', $string); };
$myValues = array_map($f, $myValues);
在PHP中,匿名函數是否存在「垃圾回收」的問題? – 2013-03-14 01:39:40
@YauhenYakimovich你在說什麼?除此之外,這很大程度上取決於你使用的版本,你作爲一個用戶應該永遠不需要關心GC,因爲內置的GC在他的工作上相當不錯:) – KingCrunch 2013-03-14 01:42:56
我記得GC主要是PHP中的引用計數機制。是的 - 匿名函數確實有內存泄漏..只是想知道什麼是目前的狀態(例如使用匿名函數生產代碼) – 2013-03-14 01:50:55
你確定你已經嘗試過'FILTER_FLAG_STRIP_HIGH'過濾器嗎? – edwardmp 2013-03-14 00:54:41
建議更明確地說明是否需要區分大小寫。如果是這樣,請提及應刪除大寫字符。如果沒有(這是我懷疑你想要的),那麼應該保留a-z和A-Z。另外假設你想剝離exotics ä&egrave; &otilde ;.如果你確實想剝離它們,那麼我建議不需要改變,但只是檢查。另外,它是一個令人失望的答案大多數不使用過濾器,因爲你問? – 2013-03-15 12:31:11