Sadece son boşluk karakteri ile bir dize bölmek için Regex

3 Cevap php

umarım bu ben bir diziye bir dize bölmek için çalışıyor ama boşluklarla sadece son örneği tarafından ediyorum PHP kullanarak, hızlı ve basit bir olmalıdır. Şimdiye kadar var ...

$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 )

... Hangi s'nin bütün örnekleri tarafından böler.

Nasıl boşlukla sadece son örneği tarafından bölmek için bu normal bir ifade genişletebilirsiniz? Olmak için ...

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

Lütfen yardım şimdiden teşekkür ederiz!

3 Cevap

Deneyin:

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

Edit

Kısa bir açıklama:

(?= ... ) pozitif look ahead adlandırılır. Örneğin, a(?=b), yalnızca uygun bir tek 'a' sonraki karakter (bunun sağındaki bir) bir 'b' ise. 'b' maçın not bir parçası olduğunu unutmayın!

\S character class [^\s] için sadece bir kısa eldir. Başka bir deyişle: bir beyaz boşluk karakteri dışında bir tek karakterle eşleşir. + sonra * kılan karakter sınıfı \S possessive.

Son olarak, $ dizenin sonunu gösterir.

Şöyle Özetlemek gerekirse, tam regex \s+(?=\S*+$) düz İngilizce okurdu:

öncesinde dize sonuna ardından beyaz boşluk karakterleri, daha sıfır veya daha fazla karakter başka bu boşluk karakterleri görünümlü sadece bir veya daha fazla beyaz boşluk karakterleri neticesinde görülebilir.

Bu çalışması gerekir:

$str="hello this is a  space";

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

Bir regex olmadan bunu yapabilir:

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

veya

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

* ve + sonra, \S dupicated ise? Sadece /\s+(?=\S+$)/ veya /\s+(?=\S*$)/ yeterli ihtiyacına bağlıdır.