如何让ucwords只用于单引号而不用于撇号?

时间:2012-01-17 17:23:20

标签: php

我想转此文:

  

她说是时候“找到解决方案了”。

进入本文:

  

她说现在是'找到解决方案'的时候了。

我目前正在使用ucwords和这个与ucwords相关的函数在单引号后输出大写字母:(我在php.net的comment section找到了。)

function ucwordsMore ($str) {
    $str = str_replace("' ","'",ucwords(str_replace("'","' ",$str)));
    return $str;
}

但是,此功能导致:

  

她说是时候找'解决'了。

如何在撇号小后保留字母,并在单引号后字母

3 个答案:

答案 0 :(得分:4)

它通常适用于一些模式匹配:

$str = preg_replace("/\w[\w']*/e", "ucwords('\\0')", $str);

\w适用于ASCII字母和数字。对于国际文字,请使用\pL/u修饰符。

答案 1 :(得分:0)

抱歉,单引号和撇号之间没有区别。如果有意义的话,你将不得不使用某些东西来区分这两者。您可以使用的启发式方法是,如果在撇号之后只有一个或两个连续的字符,您可以认为它是收缩而不是单引号字符串。

编辑:这是一个愚蠢的启发式,我不推荐,但我还是做了。

function ucwordsMore ($str) {
    $str = str_replace("' ","'",ucwords(str_replace("'","' ",$str)));
    return $str;
}

$string  = "She's Saying It's Time To 'Find A Solution'.";

$string = ucwordsMore($string);
//string now equals = She'S Saying It'S Time To 'Find A Solution'.
for($i = 0; $i < strlen($string); $i++){
    if($string[$i] == "'"){
      if($i +2 < strlen($string) && $string[$i] == "'"&& $string[$i+1] != " "&& $string[$i+2] == " "){
          $string[$i+1] = strtolower($string[$i+1]); //replace
    }
      if($i +3 < strlen($string) && $string[$i] == "'"&& $string[$i+1] != " "&& $string[$i+2] != " "&& $string[$i+3] == " "){
          $string[$i+1] = strtolower($string[$i+1]); //replace
          $string[$i+2] = strtolower($string[$i+2]); //replace
    }

}
}
echo $string;
//$string - "She's Saying It's Time To 'Find A Solution'."

答案 2 :(得分:-1)

$str = ucwords($str);

$str = preg_replace_callback("/(^|\\s+)'[a-z]/", create_function(
    '$matches',
    'return strtoupper($matches[0]);'
), $str);