2011-10-27 12 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が配列に対して2回反復することだけです。ループの場合は、foreachのループを使用して、両方を1つのループで行うことができます。

また、匿名関数はPHP 5.3のものです。このコードのほとんどは、関数を独自の名前付き関数に分け、その関数への参照を渡すだけです。

+0

'*'を含め、値全体を返しませんか?要件は '*'ではなく、単語を捕捉することだけであるように見えます。 –

+0

@ e.dan:そうは思わない。 CodePadを確認してください。 – alex

+0

マイナーポイント - array_mapはまず配列をとり、次にコールバック関数をとります。配列は2回処理されますが(アスタリスクを検索するために1回、次にワードを検索するために1回)、少し効率が悪いようです。 – majelbstoat

0

あなたはいつもそのような配列を持っている(つまり、複雑な文字列や単語だけはない)、本当に正規表現を使うべきではありません。それは過剰です。 検索にはstrpos、削除するにはstr_replaceやrtrimなどの文字列関数を使用します。

ファンシー置換ルール(正規表現など)が必要ない場合は、preg_replace()の代わりにこの関数を使用する必要があります。 str_replace manualから

0

このためにするpreg_matchを使用する必要はありません - 文字列に対する単純なchar型のルックアップは動作します:

$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

こんにちは仲間のブリスバナイト! :) – alex

+0

@alexこんにちは!私は実際にはさらに2日間ブリスバイトです。その後、私はサンフランシスコになります(実際にはまだポン!) – majelbstoat

+0

私は見る。あなたの旅を楽しんでください! – alex