将字符串中的所有奇数单词编辑为大写

时间:2015-04-20 23:16:44

标签: php regex string

我需要将所有奇数单词编辑为大写。

以下是输入字符串的示例:

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函数。

3 个答案:

答案 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

Demo

答案 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)

您可能不需要只需使用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