使用php preg_match(正则表达式)将camelCase单词拆分为单词
我该如何拆分这个词:使用php preg_match(正则表达式)将camelCase单词拆分为单词,php,regex,string,preg-match,Php,Regex,String,Preg Match,我该如何拆分这个词: oneTwoThreeFour 进入阵列,以便我可以获得: one Two Three Four 与preg_匹配 我对此感到厌倦,但它只是提供了一个完整的词 $words = preg_match("/[a-zA-Z]*(?:[a-z][a-zA-Z]*[A-Z]|[A-Z][a-zA-Z]*[a-z])[a-zA-Z]*\b/", $string, $matches)`; 您可以使用preg\u split作为: $arr = preg_split('/(?=[A
oneTwoThreeFour
进入阵列,以便我可以获得:
one Two Three Four
与preg_匹配
我对此感到厌倦,但它只是提供了一个完整的词
$words = preg_match("/[a-zA-Z]*(?:[a-z][a-zA-Z]*[A-Z]|[A-Z][a-zA-Z]*[a-z])[a-zA-Z]*\b/", $string, $matches)`;
您可以使用
preg\u split
作为:
$arr = preg_split('/(?=[A-Z])/',$str);
preg_match_all('/((?:^|[A-Z])[a-z]+)/',$str,$matches);
我基本上是在大写字母之前拆分输入字符串。使用的正则表达式
(?=[A-Z])
与大写字母前的点匹配。您也可以使用preg\u match\u all
:
$arr = preg_split('/(?=[A-Z])/',$str);
preg_match_all('/((?:^|[A-Z])[a-z]+)/',$str,$matches);
说明:
( - Start of capturing parenthesis.
(?: - Start of non-capturing parenthesis.
^ - Start anchor.
| - Alternation.
[A-Z] - Any one capital letter.
) - End of non-capturing parenthesis.
[a-z]+ - one ore more lowercase letter.
) - End of capturing parenthesis.
另一个选项是匹配
/[A-Z]?[A-Z]+/
-如果您知道输入的格式正确,它应该可以很好地工作
[A-Z]?
将匹配大写字母(或不匹配)<代码>[a-z]+将匹配以下所有小写字母,直到下一个匹配为止
工作示例:我知道这是一个有公认答案的老问题,但我知道有什么更好的解决方案:
诀窍是一个可重复的模式$1$2$1$2或更低的上下等。。。。
例如
helloWorld=$1与“hello”匹配,$2与“W”匹配,$1与“World”匹配,因此简而言之,您得到$1$2$1或“hello World”,将helloWorld与$2$1$2$1匹配,或再次与“hello World”匹配。然后,您可以在第一个单词中使用大写字母或小写字母,或者在空格中使用u或其他字符将它们分开
简洁明了。功能化版本的@ridgerunner答案
/**
* Converts camelCase string to have spaces between each.
* @param $camelCaseString
* @return string
*/
function fromCamelCase($camelCaseString) {
$re = '/(?<=[a-z])(?=[A-Z])/x';
$a = preg_split($re, $camelCaseString);
return join($a, " " );
}
/**
*将大小写字符串转换为每个字符串之间有空格。
*@param$camelCaseString
*@返回字符串
*/
camelcase的函数($camelCaseString){
$re='/(?您可以在“滑动”中从小写字母拆分为大写字母,因此:
$parts = preg_split('/([a-z]{1})[A-Z]{1}/', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
//PREG_SPLIT_DELIM_CAPTURE to also return bracketed things
var_dump($parts);
令人恼火的是,您将不得不从$parts中的每一对对应项中重建单词
希望这有助于 < P> > RigGelunne的回答很好,似乎不适用于出现在句子中段的所有CAPs子串。我使用下面的方法,似乎处理好了:
function splitCamelCase($input)
{
return preg_split(
'/(^[^A-Z]+|[A-Z][^A-Z]+)/',
$input,
-1, /* no limit for replacement count */
PREG_SPLIT_NO_EMPTY /*don't return empty elements*/
| PREG_SPLIT_DELIM_CAPTURE /*don't strip anything from output array*/
);
}
一些测试用例:
assert(splitCamelCase('lowHigh') == ['low', 'High']);
assert(splitCamelCase('WarriorPrincess') == ['Warrior', 'Princess']);
assert(splitCamelCase('SupportSEELE') == ['Support', 'SEELE']);
assert(splitCamelCase('LaunchFLEIAModule') == ['Launch', 'FLEIA', 'Module']);
assert(splitCamelCase('anotherNASATrip') == ['another', 'NASA', 'Trip']);
首先,Coddick感谢你的模式,它帮助了很多
我需要一个在介词“a”存在的情况下有效的解决方案:
e、 g.这是一个很好的判决
我通过两步预匹配找到了解决方案,并制作了一个带有一些选项的函数:
/*
* input: 'thisIsACamelCaseSentence' output: 'This Is A Camel Case Sentence'
* options $case: 'allUppercase'[default] >> 'This Is A Camel Case Sentence'
* 'allLowerCase' >> 'this is a camel case sentence'
* 'firstUpperCase' >> 'This is a camel case sentence'
* @return: string
*/
function camelCaseToWords($string, $case = null){
isset($case) ? $case = $case : $case = 'allUpperCase';
// Find first occurances of two capitals
preg_match_all('/((?:^|[A-Z])[A-Z]{1})/',$string, $twoCapitals);
// Split them with the 'zzzzzz' string. e.g. 'AZ' turns into 'AzzzzzzZ'
foreach($twoCapitals[0] as $match){
$firstCapital = $match[0];
$lastCapital = $match[1];
$temp = $firstCapital.'zzzzzz'.$lastCapital;
$string = str_replace($match, $temp, $string);
}
// Now split words
preg_match_all('/((?:^|[A-Z])[a-z]+)/', $string, $words);
$output = "";
$i = 0;
foreach($words[0] as $word){
switch($case){
case 'allUpperCase':
$word = ucfirst($word);
break;
case 'allLowerCase':
$word = strtolower($word);
break;
case 'firstUpperCase':
($i == 0) ? $word = ucfirst($word) : $word = strtolower($word);
break;
}
// remove te 'zzzzzz' from a word if it has
$word = str_replace('zzzzzz','', $word);
$output .= $word." ";
$i++;
}
return $output;
}
请随意使用它,如果有一种“更简单”的方法可以一步完成,请发表评论!我使用了cool guy Ridgerunner的代码(如上)并将其制作成一个函数:
echo deliciousCamelcase('NewNASAModule');
function deliciousCamelcase($str)
{
$formattedStr = '';
$re = '/
(?<=[a-z])
(?=[A-Z])
| (?<=[A-Z])
(?=[A-Z][a-z])
/x';
$a = preg_split($re, $str);
$formattedStr = implode(' ', $a);
return $formattedStr;
}
echo deliciousamelcase('NewNASAModule');
功能Delicious案例($str)
{
$formattedStr='';
$re=/
(?基于@codaddict答案的完整功能:
function splitCamelCase($str) {
$splitCamelArray = preg_split('/(?=[A-Z])/', $str);
return ucwords(implode($splitCamelArray, ' '));
}
当确定项目的最佳模式时,您需要考虑以下模式因素:
准确性(稳健性)——模式是否在所有情况下都是正确的,并且是合理的未来证明
效率——模式应该是直接的、深思熟虑的,并且避免不必要的劳动
简洁——模式应该使用适当的技术来避免不必要的字符长度
可读性——模式应该尽可能简单
上述因素也恰好是在努力遵守的层次顺序中。换句话说,当1不完全满足要求时,对2、3或4进行优先排序对我来说没有多大意义。可读性在列表的底部,因为在大多数情况下我可以遵循语法
捕获组和Lookarounds通常会影响模式效率。事实是,除非您在数千个输入字符串上执行此正则表达式,否则无需过度提高效率。可能更重要的是关注与模式简洁性相关的模式可读性
下面的一些模式需要通过其preg
函数进行一些额外的处理/标记,但以下是一些基于OP示例输入的模式比较:
preg\u split()
模式:
/^[^A-Z]+\K |[A-Z][^A-Z]+\K/
(21个步骤)
/(^[^A-Z]+|[A-Z][^A-Z]+)/
(26个步骤)
/[^A-Z]+\K(?=[A-Z])/
(43个步骤)
/(?=[A-Z])/
(50步)
/(?=[A-Z]+)/
(50步)
/([a-z]{1})[a-z]{1}/
(53个步骤)
/([a-z0-9])([a-Z])/
(68个步骤)
/(?这是一个更好的解决方案,第一次起作用(其他人在数组中添加了空白值,这是完美的!谢谢!+1像NewNASAModule
(输出:[New,NASAModule]
;我希望[New,NASA,Module]
)@rr-是的,你是正确的。请参阅我的另一个更新答案,该答案拆分为:NewNASAModule
正确:它不包含数字大小写。出于某种原因,其他回复者也忽略了这一基本事实。例如,“Css3Transform”或alikeoops,这可能会在连续的CAPS问题上失败。非捕获组不会导致结果失败[one,wo,hree,our]?@AaronJLang不,因为外圆括号捕获了整个组,包括子组。他不想把$matches集合弄得乱七八糟。这对我来说是失败的,因为“TestID”使用了:“preg_match_all('/(?:^[a-Z][a-Z]+)/”,$key,$matches);die(内爆(',$matches[0])”因为它不喜欢连续大写的问题。我需要用空格分割大小写更改,@blak3r的解决方案对我来说很有效:HTMLParser
等字符串的更好解决方案会起作用:。正如@TarranJones所规定的那样(尽管表达得不太清楚),您不需要外括号。匹配的字符串/(?:^ |[A-Z])[A-Z]+/'
足以生成一个数组(而不是两个)。这是因为preg_match_all()
自动捕获匹配的所有实例,而无需特别规定。美观大方-始终优先
$noAcronyms = 'oneTwoThreeFour';
var_export(preg_split('~^[^A-Z]+\K|[A-Z][^A-Z]+\K~', $noAcronyms, 0, PREG_SPLIT_NO_EMPTY));
echo "\n---\n";
var_export(preg_match_all('~[A-Z]?[^A-Z]+~', $noAcronyms, $out) ? $out[0] : []);
$withAcronyms = 'newNASAModule';
var_export(preg_split('~[^A-Z]+\K|(?=[A-Z][^A-Z]+)~', $withAcronyms, 0, PREG_SPLIT_NO_EMPTY));
echo "\n---\n";
var_export(preg_match_all('~[A-Z]?[^A-Z]+|[A-Z]+(?=[A-Z][^A-Z]|$)~', $withAcronyms, $out) ? $out[0] : []);