Php 如何使ucwords仅适用于单引号而不适用于撇号?
我想把这段文字: 她说现在是“找到解决办法”的时候了 在本文中: 她说现在是“找到解决办法”的时候了 我目前正在使用ucwords和这个与ucwords相关的函数在单引号后生成大写字母:(我在php.net的 但是,此功能会导致以下情况: 她说现在是“找到解决办法”的时候了Php 如何使ucwords仅适用于单引号而不适用于撇号?,php,Php,我想把这段文字: 她说现在是“找到解决办法”的时候了 在本文中: 她说现在是“找到解决办法”的时候了 我目前正在使用ucwords和这个与ucwords相关的函数在单引号后生成大写字母:(我在php.net的 但是,此功能会导致以下情况: 她说现在是“找到解决办法”的时候了 我怎样才能最好地保持撇号后面的字母小,以及单引号后面的字母大?对不起,单引号和撇号之间没有区别。如果这有意义的话,你必须用一些东西来区分两者。您可以使用的一种启发式方法是,如果撇号后面只有一个或两个连续字符,您可以假定它是一
我怎样才能最好地保持撇号后面的字母小,以及单引号后面的字母大?对不起,单引号和撇号之间没有区别。如果这有意义的话,你必须用一些东西来区分两者。您可以使用的一种启发式方法是,如果撇号后面只有一个或两个连续字符,您可以假定它是一个收缩字符,而不是单引号字符串 编辑:这是一个愚蠢的启发,我不推荐,但我还是做了
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'."
函数ucwordsMore($str){
$str=str_replace(“'”,“'”,ucwords(str_replace(“'”,“'”,$str));
返回$str;
}
$string=“她说是时候‘找到解决方案’”;
$string=ucwordsMore($string);
//string now equals=她说现在是“找到解决方案”的时候了。
对于($i=0;$i
它通常与一些模式匹配一起工作:
$str = preg_replace("/\w[\w']*/e", "ucwords('\\0')", $str);
\w
适用于ASCII字母和数字。对于国际文本,请使用\pL
和/u
修饰符。我知道,问题是什么?我添加了一个关于您可以使用的启发式的编辑。如果您想更准确,基本上可以创建一个不希望大写的单词数组,并在遍历列表时进行检查。基本上,你使用单引号的目的是你应该使用双引号的目的。应该是评论,而不是答案。。。另一种更准确的启发式方法是在撇号之前有/没有空格。这种启发式方法绝对有意义。如果一个字符在单引号之后,那么它应该保持小。我想这比循环列表更有意义。我最好怎么做?我怎样才能确定一个引号后面是否只有一个字符,或者前面是否有一个空格,就像Mark刚才提到的那样?就像一个符咒!谢谢大家!+1-一般来说,我不喜欢使用/e
修饰符,但这是一个非常优雅的解决方案。Mario,在这个示例中,您将如何使用pL和u?因为非英语字母前面的字母也会变大。很抱歉问。。。我不是正则表达式专家。。。
$str = ucwords($str);
$str = preg_replace_callback("/(^|\\s+)'[a-z]/", create_function(
'$matches',
'return strtoupper($matches[0]);'
), $str);
$str = ucwords($str);
$str = preg_replace_callback("/(^|\\s+)'[a-z]/", create_function(
'$matches',
'return strtoupper($matches[0]);'
), $str);