我需要将所有奇数单词编辑为大写。
以下是输入字符串的示例:
very long string with many words
预期产出:
VERY long STRING with MANY words
我有这个代码,但它接触到我,我可以更好地做到这一点。
<?php
$lines = file($_FILES["fname"]["tmp_name"]);
$pattern = "/(\S[\w]*)/";
foreach($lines as $value)
{
$words = NULL;
$fin_str = NULL;
preg_match_all($pattern, $value, $matches);
for($i = 0; $i < count($matches[0]); $i = $i + 2){
$matches[0][$i] = strtoupper($matches[0][$i]);
$fin_str = implode(" ", $matches[0]);
}
echo $fin_str ."<br>";
P.S。我只需要使用preg_match函数。
答案 0 :(得分:1)
这是preg_replace_callback
示例:
<?php
$str = 'very long string with many words';
$newStr = preg_replace_callback('/([^ ]+) +([^ ]+)/',
function($matches) {
return strtoupper($matches[1]) . ' ' . $matches[2];
}, $str);
print $newStr;
// VERY long STRING with MANY words
?>
您只需要匹配重复模式:/([^ ]+) +([^ ]+)/
,一对单词,然后preg_replace_callback
对字符串进行递归,直到匹配并替换所有可能的匹配。调用preg_replace_callback
函数并将捕获的反向引用传递给它需要strtoupper
。
答案 1 :(得分:0)
如果您 使用正则表达式,这应该可以帮助您入门:
$input = 'very long string with many words';
if (preg_match_all('/\s*(\S+)\s*(\S+)/', $input, $matches)) {
$words = array();
foreach ($matches[1] as $key => $odd) {
$even = isset($matches[2][$key]) ? $matches[2][$key] : null;
$words[] = strtoupper($odd);
if ($even) {
$words[] = $even;
}
}
echo implode(' ', $words);
}
这将输出:
VERY long STRING with MANY words
答案 2 :(得分:0)
您可能不需要regex只需使用explode
并再次连接字符串:
<?php
function upperizeEvenWords($str){
$out = "";
$arr = explode(' ', $str);
for ($i = 0; $i < count($arr); $i++){
if (!($i%2)){
$out .= strtoupper($arr[$i])." ";
}
else{
$out .= $arr[$i]." ";
}
}
return trim($out);
}
$str = "very long string with many words";
echo upperizeEvenWords($str);
结帐DEMO