2011-12-20 12 views
12

हो सकता है कि मैं ऊपरी-केस वर्णों के आधार पर स्ट्रिंग $chunks टुकड़ों में विस्फोट कर सकता हूं?ऊपरी केस वर्णों पर एक स्ट्रिंग विस्फोट करें?

$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 

उत्तर

31

का उपयोग preg_split()[A-Z] पर करना चाहिए:

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

संपादित
ऐसा न करने पर जरूरत सरणी ही, तुम बस अपरकेस वर्णों preprend कर सकते हैं (सिवाय पहला) एक हाइफ़न के साथ (-):

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

(demo)

+0

हम्म, JRL प्रदान की [अग्रदर्शी] (http://www.regular-expressions.info/lookaround.html#lookahead) इससे पहले कि मैं मेरा मिला [काम कर ] (http://www.ideone.com/4ux5G) :) इसके अलावा, ध्यान दें '$ chucks' बनाम '$ chunks' – jensgram

+0

नियमित अभिव्यक्ति सीखने का समय मुझे लगता है। इस सुरुचिपूर्ण समाधान के लिए धन्यवाद! – gremo

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

परिणाम को 'array_shift' करने की भी आवश्यकता है। –

+0

array_shift केवल तभी जरूरी है जब वाक्य ऊपरी मामले से शुरू होता है ... यदि यह कम मामले से शुरू होता है, तो array_shift() –

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

$string = 'setIfUnmodifiedSince'; 
echo splitAtUpperCase($string); 
संबंधित मुद्दे