2012-01-17 34 views
1

我希望把这样的文字:如何使ucwords仅适用于单引号而不是撇号?

她说这是一次“找到一个解决方案”。

到这样的文字:

她说这是时间 '找到一个解决方案'。

我目前使用两种ucwords这ucwords相关的功能单引号后,使大写字母:(我在php.net的comment section找到)

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

但是,此功能结果在这里:

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

我怎样才能最好的保持字母撇号小后,和字母单引号大后?

回答

3

它通常用位模式匹配的工作原理:

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

\w是正常的ASCII字母和数字。国际文本使用\pL/u修饰符。

+0

工程就像一个魅力!谢谢! – 2012-01-17 17:40:13

+0

+1 - 总的来说,我喜欢留在'/ e'修改了,但是这是一个非常优雅的解决方案。 – FtDRbwLXw6 2012-01-17 17:41:51

+0

马里奥,你如何在这个例子中使用PL和你?因为非英文字母前面的字母也变得很大。对不起,问我...我不是一个正则表达式专家... – 2012-03-13 15:13:47

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'." 
+0

我知道,问题是什么? – 2012-01-17 17:29:35

+0

我添加了关于您可以使用的启发式的编辑。如果你想更准确的话,你可以基本上创建一些你不想被大写的单词,并在迭代列表时检查它。基本上你使用单引号是你应该使用双引号。 – jakx 2012-01-17 17:31:34

+0

应该是一个评论,不是答案......和另一种更准确的启发是存在/不存在的空间的撇号 – 2012-01-17 17:32:27

-1
$str = ucwords($str); 

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