Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使ucwords仅适用于单引号而不适用于撇号?_Php - Fatal编程技术网

Php 如何使ucwords仅适用于单引号而不适用于撇号?

Php 如何使ucwords仅适用于单引号而不适用于撇号?,php,Php,我想把这段文字: 她说现在是“找到解决办法”的时候了 在本文中: 她说现在是“找到解决办法”的时候了 我目前正在使用ucwords和这个与ucwords相关的函数在单引号后生成大写字母:(我在php.net的 但是,此功能会导致以下情况: 她说现在是“找到解决办法”的时候了 我怎样才能最好地保持撇号后面的字母小,以及单引号后面的字母大?对不起,单引号和撇号之间没有区别。如果这有意义的话,你必须用一些东西来区分两者。您可以使用的一种启发式方法是,如果撇号后面只有一个或两个连续字符,您可以假定它是一

我想把这段文字:

她说现在是“找到解决办法”的时候了

在本文中:

她说现在是“找到解决办法”的时候了

我目前正在使用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);