2015-02-13 12 views
5

Giả sử tôi có một chuỗi:chia không gian đầu tiên và không gian cuối cùng trong một chuỗi và giới hạn kích thước của đầu ra trong 3

ABC DEF SASF 123 (35) 

Và kết quả mong muốn của tôi như:

Array (
    [0] => ABC 
    [1] => DEF SASF 123 
    [2] => (35) 
) 

Tôi cố gắng để làm điều này với $str = preg_split("/(^\S+\s+)|\s+(?=\S+$)/",$str, 3); Nhưng vấn đề hiện tại là RegEx này sẽ thay thế nội dung trong $str[0] và nó sẽ giống như

Array (
    [0] => 
    [1] => DEF SASF 123 
    [2] => (35) 
) 

Làm cách nào tôi có thể sửa đổi RegEx để xuất kết quả mong đợi của mình?

Ví dụ trực tuyến: https://www.regex101.com/r/rK5lU1/2

Trả lời

4

Chỉ cần tách chuỗi đầu vào của bạn theo regex dưới đây.

^\S+\K\s+|\s+(?=\S+$) 

Chỉ cần khớp từ đầu tiên và sau đó loại bỏ nó bằng cách thêm \K bên cạnh \S+. Sau đó, khớp với một hoặc nhiều dấu cách sau. | HOẶC đối sánh thêm một khoảng trống ngay trước từ cuối cùng. \S+ khớp với một hoặc nhiều ký tự không dấu cách.

DEMO

$str = "ABC DEF SASF 123 (35)"; 
$match = preg_split('~^\S+\K\s+|\s+(?=\S+$)~', $str); 
print_r($match); 

Output:

Array 
(
    [0] => ABC 
    [1] => DEF SASF 123 
    [2] => (35) 
) 
2
^(\S+)\s+|\s+(?=\S+$) 

Hãy thử tách của thành viên này. Mã mẫu.

preg_split('/^(\S+)\s+|\s+(?=\S+$)/', 'ABC DEF SASF 123 (35)', -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE) 

Hoặc chỉ khớp và chụp hình thay vì chia nhỏ.

^(\S+)\s+(.*?)\s+(\S+)$ 

See demo

$re = "/^(\\S+)\\s+(.*?)\\s+(\\S+)$/"; 
$str = "ABC DEF SASF 123 (35)"; 

preg_match_all($re, $str, $matches); 
+0

Mã của bạn sẽ không hoạt động nếu không có những lá cờ. Không biết tại sao bạn thậm chí không nói bất cứ điều gì về nó. – nhahtdh

+0

Câu trả lời được chấp nhận dễ hiểu và đơn giản hơn giải pháp IMO này. – user3571945

+0

@ user3571945 yup bạn có sự đồng ý của tôi. Bất cứ lúc nào nthing làm việc trong việc học nhiều hơn 1 cách :) – vks

Các vấn đề liên quan