2011-10-27 115 views
1

我對preg_match不太瞭解,但我想知道是否有人可以幫我一把。 我有一個值的數組,例如array("black*", "blue", "red", "grey*")我需要在最後找到*的值,然後返回它之前的單詞。preg_match PHP建議

我相信preg_match()是做這件事的最佳方式,但我願意接受建議。

感謝先進!

+0

你想要的話末尾沒有'*'到還要歸還? – alex

回答

2

如果必須使用正則表達式...

$words = array_map(function($word) { 
    return preg_replace('/\*\z/', '', $word); 
}, $arr); 

CodePad

...但你可能不關閉使用正則表達式,並使用類似更好......

$words = array_map(function($word) { 
    return rtrim($word, '*'); 
}, $arr); 

CodePad

如果你想返回只有其中有一個尾隨*的話,嘗試這樣的事情第一... ...

$words = preg_grep('/\*\z/', $arr); 

CodePad

這個(如評論中提到的)的唯一缺點是PHP將在數組上迭代兩次。如果您願意,您可以簡單地使用一個foreach循環在一個循環中執行這兩個循環。

另外,值得一提的是匿名函數是一個PHP 5.3的東西。您仍然可以使用這些代碼的大部分功能,只需將這些功能分離到各自的命名函數中,並將引用傳遞給它們。

+0

是不是會返回整個值,包括'*'?這個要求似乎只是捕獲這些詞,而不是'*'。 –

+0

@ e.dan:我不相信會。檢查CodePads。 – alex

+0

小點 - array_map首先獲取數組,然後是回調函數。它會工作,雖然處理數組兩次(一次搜索星號,然後一次檢索單詞)似乎效率不高。 – majelbstoat

0

如果你總是有一個這樣的數組(即沒有複雜的字符串,只是字*),你真的不應該使用正則表達式,這是一個矯枉過正。 使用字符串函數,如用於搜索的strpos和用於刪除*的str_replace或rtrim。

如果您不需要花哨的替換規則(如正則表達式),則應該始終使用此函數而不是preg_replace()。

str_replace manual

0

不需要使用的preg_match此 - 在字符串簡單字符查找將工作:

$words = array('red*', 'grey', 'white', 'green*'); 
$return = array(); 

foreach ($words as $word) { 
    if ($word[strlen($word) - 1] === '*') { 
     $return[] = substr($word, 0, -1); 
    } 
} 
var_dump($return); 
+0

你好同伴Brisbanite! :) – alex

+0

@alex你好!我其實是一個布里斯班人兩天以上,過了這段時間,我將成爲聖方濟會(儘管在現實中,仍然是一個普姆!) – majelbstoat

+0

我明白了。那麼,享受你的旅程吧! – alex