2013-09-05 26 views
13
$str = "This is a string"; 
$words = explode(" ", $str); 

Hoạt động tốt, nhưng không gian vẫn đi vào mảng:php nổ: string chia thành các từ bằng cách sử dụng không gian một delimiter

$words === array ('This', 'is', 'a', '', '', '', 'string');//true 

Tôi muốn có những lời chỉ không có dấu cách và giữ các thông tin về số lượng không gian riêng biệt.

$words === array ('This', 'is', 'a', 'string');//true 
$spaces === array(1,1,4);//true 

Chỉ cần thêm: (1, 1, 4) có nghĩa là một dấu cách sau từ đầu tiên, một dấu cách sau từ thứ hai và 4 dấu cách sau từ thứ ba.

Có cách nào để thực hiện nhanh không?

Cảm ơn bạn.

+1

http://stackoverflow.com/questions/3432183/how-can-i-remove-all-empty -giá trị-khi-i-explode-a-string-using-php – Habib

+0

Bạn có muốn số không gian hoặc vị trí của mỗi không gian không? –

+0

@JasonMcCreary Ông muốn số không gian liên tiếp trong mỗi nhóm không gian: ''' (1), '' (1), '' (4)'. – silkfire

Trả lời

22

Đối với tách chuỗi thành một mảng, bạn nên sử dụng preg_split:

(số lượng có đếm)
$string = 'This is a string'; 
$data = preg_split('/\s+/', $string); 

phần thứ hai của bạn:

$string = 'This is a string'; 
preg_match_all('/\s+/', $string, $matches); 
$result = array_map('strlen', $matches[0]);// [1, 1, 4] 
+0

'Số lượng khoảng trống' về người hỏi được mong đợi ở đâu? – Bora

+0

Cảm ơn bạn đã trả lời. Howerer, bạn mất thông tin về số lượng không gian ở giữa. Đó là những gì tôi hỏi trong câu hỏi (xin xem văn bản in đậm). – Haradzieniec

+0

@Haradzieniec chỉ cần gõ, vâng. Cảm ơn bạn, tôi đã cập nhật. –

1

Bạn có thể sử dụng preg_split() cho mảng đầu tiên:

$str = 'This is a string'; 
$words = preg_split('#\s+#', $str); 

preg_match_all() cho $spaces mảng:

preg_match_all('#\s+#', $str, $m); 
$spaces = array_map('strlen', $m[0]); 
+0

1, 1, 4 nghĩa là một dấu cách sau từ đầu tiên, một dấu cách sau từ thứ hai và 4 dấu cách sau từ thứ ba. – Haradzieniec

+0

@Haradzieniec Xem chỉnh sửa của tôi :) – silkfire

1

Một cách khác để làm điều đó là sử dụng vòng lặp foreach.

$str = "This is a string"; 
$words = explode(" ", $str); 
$spaces=array(); 
$others=array(); 
foreach($words as $word) 
{ 
if($word==' ') 
{ 
array_push($spaces,$word); 
} 
else 
{ 
array_push($others,$word); 
} 
} 
+0

Cảm ơn bạn. Tuy nhiên, nó thu thập không gian, nhưng nó không chứa thông tin về số khoảng trống giữa các từ. – Haradzieniec

2

Dưới đây là một cách, tách chuỗi và chạy một regex một lần, sau đó phân tích các kết quả để xem những đoạn bị bắt như sự chia rẽ (và do đó chỉ có khoảng trắng), hoặc những người thân mà là những từ:

$temp = preg_split('/(\s+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 

$spaces = array(); 
$words = array_reduce($temp, function(&$result, $item) use (&$spaces) { 
    if(strlen(trim($item)) === 0) { 
     $spaces[] = strlen($item); 
    } else { 
     $result[] = $item; 
    } 
    return $result; 
}, array()); 

Bạn có thể thấy rằng from this demo$words là:

Array 
(
    [0] => This 
    [1] => is 
    [2] => a 
    [3] => string 
) 

$spaces là:

Array 
(
    [0] => 1 
    [1] => 1 
    [2] => 4 
) 
+0

cảm ơn bạn rất nhiều vì bạn đã trả lời. Tôi đã thử nghiệm cả giải pháp của bạn và Alma Do Mundo/silkfire. Tất cả các giải pháp đều hoạt động tốt, nhưng công việc của Alma Do Mundo nhanh hơn gấp hai lần. Cảm ơn bạn cho giải pháp của bạn anyway. Bạn có thể so sánh cả hai nếu bạn muốn (vui lòng xem câu trả lời của tôi về câu hỏi của riêng tôi trong giây lát). – Haradzieniec

0

Dưới đây là kết quả của các bài kiểm tra hiệu suất:

$str = "This is a string"; 

var_dump(time()); 

for ($i=1;$i<100000;$i++){ 
//Alma Do Mundo - the winner 
$rgData = preg_split('/\s+/', $str); 


preg_match_all('/\s+/', $str, $rgMatches); 
$rgResult = array_map('strlen', $rgMatches[0]);// [1,1,4] 


} 
print_r($rgData); print_r($rgResult); 
var_dump(time()); 




for ($i=1;$i<100000;$i++){ 
//nickb 
$temp = preg_split('/(\s+)/', $str, -1,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 
$spaces = array(); 
$words = array_reduce($temp, function(&$result, $item) use (&$spaces) { 
    if(strlen(trim($item)) === 0) { 
     $spaces[] = strlen($item); 
    } else { 
     $result[] = $item; 
    } 
    return $result; 
}, array()); 
} 


print_r($words); print_r($spaces); 
var_dump(time()); 

int (1378392870) Mảng ( [0] => Đây [1] => là [2] => a [3] => chuỗi ) mảng ( [0] => 1 [1] => 1 [2] => 4 ) int (1378392871) 0.123.Mảng ( [0] => Đây [1] => là [2] => a [3] => chuỗi ) Mảng ( [0] => 1 [1] = > 1 [2] => 4 ) int (1378392873)

4

$financialYear = 2015-2016;

$test = explode('-',$financialYear); 
echo $test[0]; // 2015 
echo $test[1]; // 2016 
Các vấn đề liên quan