2009-10-07 11 views
11

うまくいけば、これはPHPを使用した素早く簡単なものです。文字列を配列に分割しようとしていますが、空白の最後のインスタンスだけです。これまでのところ、私は...文字列を最後の空白文字だけで分割する正規表現

$str="hello this is  a space"; 
$arr=preg_split("/\s+/",$str); 
print_r($arr); 

Array ([0] => hello [1] => this [2] => is [3] => a [4] => space) 

...すべての空白のインスタンスで分割します。

空白の最後のインスタンスだけで分割するようにこの正規表現を拡張するにはどうすればよいですか?なるには...

Array ([0] => hello this is  a [1] => space) 

ありがとうございました!

答えて

36

試してみてください。

$arr=preg_split("/\s+(?=\S*+$)/",$str); 

編集

短い説明:

(?= ...)が正look aheadと呼ばれています。たとえば、a(?=b)は、次の文字(右側の文字)が'b'の場合は、'a'と一致します。 'b'ではなく、の一部です!

は、character class[^\s]の単なる短縮形です。つまり、空白文字以外の1文字に一致します。 の後の+は、文字クラスを\Spossessiveにします。

最後に、$は、文字列の最後を示します。

試合一つ以上の空白文字を先にそれらの空白文字の空白文字以外のゼロ以上の文字を探しているときにのみ、次のように要約すると、完全な正規表現\s+(?=\S*+$)は平易な英語で読んでいました

、文字列の最後に続く文字が表示されます。

+0

優れている、よかった、それは完璧に動作します。 理解のために、その式の '(?= \ S * + $)'部分がどのように機能するのか説明できますか? – chattsm

+0

あなたはマーティンです。説明については、 'edit'を参照してください。 –

+0

それは素晴らしいバート、おかげです。もし私ができるなら、私はあなたに多くのポイントを与えるだろう! – chattsm

2

これは動作するはずです:

$str="hello this is a space"; 

preg_match('~^(.*)\s+([^\s]+)$~', $str, $matches); 
$result = array($matches[1], $matches[2]); 

をあなたは正規表現せずにそれを行うことができます:

$parts = array_map('trim', explode(' ', $str)); 
$result = array(
    implode(' ', array_slice($parts, 0, -1)), 
    end($parts) 
); 

または

$lastSpace = strrpos($str, ' '); 
$str1 = trim(substr($str, 0, $lastSpace)); 
$str2 = trim(substr($str, $lastSpace)); 
$result = array($str1, $str2); 
+0

おかげでトム、2つの巧妙な代替ソリューション。 – chattsm

0

\S*+がdupicated場合は? /\s+(?=\S+$)/または/\s+(?=\S*$)/のみで十分です。

+0

重複しない - '* +'は1つのコマンドであり、 '\ S * +'は '\ S *'を行うより効率的です。詳細については、「所有量限定子」を参照してください。 –

関連する問題