2011-12-20 3 views
12

Могу ли я взорвать $param строку в $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); 
} 

EDIT
Если вы не нужно сам массив, вы можете просто 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); 
Смежные вопросы