2011-12-20 70 views
12

Tôi có thể phát nổ $param chuỗi thành $chunks miếng dựa trên các ký tự chữ hoa?Phát một chuỗi ký tự chữ hoa?

$string = 'setIfUnmodifiedSince'; 
$method = substr($string, 0, 3); 
$param = substr($string, 3); 

// Split $param and implode with '-' separator 
$chunks = splitAtUpperCase($param); // Chunks are: 'If', 'Unmodified' and 'Since' 
$field = implode('-', $chunks); // Get If-Unmodified-Since HTTP field name 

Trả lời

31

Sử dụng preg_split() trên [A-Z] nên làm:

function splitAtUpperCase($s) { 
     return preg_split('/(?=[A-Z])/', $s, -1, PREG_SPLIT_NO_EMPTY); 
} 

EDIT
Nếu bạn không cần mảng chính nó, bạn chỉ có thể preprend ký tự chữ hoa (trừ đầu tiên) với dấu gạch ngang (-):

preg_replace('/(?<!^)([A-Z])/', '-\\1', $param); 

(demo)

+0

Hmm, JRL cung cấp [lookahead] (http://www.regular-expressions.info/lookaround.html#lookahead) trước khi tôi nhận mỏ [làm việc ] (http://www.ideone.com/4ux5G) :) Ngoài ra, hãy chú ý '$ chucks' và' $ chunks' – jensgram

+0

Thời gian để học biểu thức chính quy mà tôi giả sử. Cảm ơn vì giải pháp thanh lịch này! – gremo

5
$chunks = preg_split('/(?=[A-Z])/', $string); 
+0

Cũng cần phải 'array_shift' kết quả. –

+0

array_shift chỉ cần thiết nếu câu bắt đầu bằng chữ hoa chữ thường ... nếu nó bắt đầu bằng chữ thường, đừng array_shift() –

0
function splitAtUpperCase($string){ 
    return preg_replace('/([a-z0-9])?([A-Z])/','$1-$2',$string); 
} 

$string = 'setIfUnmodifiedSince'; 
echo splitAtUpperCase($string); 
Các vấn đề liên quan