【问题标题】:ucword() function with roman numerals带有罗马数字的 ucword() 函数
【发布时间】:2014-04-16 05:53:04
【问题描述】:

我正在使用 ucword 函数仅将第一个单词的大小写为 ucwords(strtolower($var)),但有时我希望单词为大写。请看下面的例子来清楚地理解。

$var = "class iii";
echo ucwords(strtolower($var));
gives as **Class Iii or Class Ii or Class Iv**

我希望它显示为 Class III or Class II or Class IV 看起来很漂亮

【问题讨论】:

标签: php


【解决方案1】:

您可以使用preg_replace_callback() 和使用正向前瞻的正则表达式来实现此目的:

/\b(?=[LXIVCDM]+\b)([a-z]+)\b/i

说明:

  • \b - 在单词边界处断言位置
  • (?= - 积极的前瞻
    • [LXIVCDM]+ - 匹配列表中的任意字符一次或多次
    • \b - 在单词边界处断言位置
  • ) - 正向预测结束
  • [a-z] - 任何字母
  • \b - 在单词边界处断言位置
  • i - 使匹配不区分大小写的模式修饰符

代码:

$str = "class iii";

$string = preg_replace_callback('/\b(?=[LXIVCDM]+\b)([a-z]+)\b/i', 
function($matches) {
    return strtoupper($matches[0]);
}, ucwords(strtolower($str)));

echo $string;

输出:

Class III

Demo

【讨论】:

  • 对不起,它显示相同的解析错误:T_FUNCTION 中的语法错误,但我在演示中看到它的工作。我在我的现场网站上测试了.. 两次
  • @user3477550:在这种情况下,您可能使用的是旧版本的 PHP。 升级。如果不能,请改用:eval.in/137326
  • @user3477550:你看到我之前的评论了吗?
【解决方案2】:

尝试改用这个:

<?php

    function xucwords($string)
    {
        $words = split(" ", $string);
        $newString = array();

        foreach ($words as $word)
        {
            if(!preg_match("/^m{0,4}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$/", $word)) {
                $word = ucfirst($word);
            } else {
                $word = strtoupper($word);
            }

            array_push($newString, $word);
        }

        return join(" ", $newString);  
    }

    echo xucwords('class iii');

?>

基于找到的函数here

【讨论】:

  • 如果是从源titanic.fauser.edu/php/function.strtolower.php.htm复制,需要注明链接!
  • @ShankarDamodaran 我做到了。
  • 你能告诉我 $lower_exceptions 数组中有什么吗??
  • @user3477550 只是将这些单词列表保持为小写。像athe 一样总是小写。
  • @user3477550 我修改了代码并删除了lower_exceptions。
【解决方案3】:

你下面的代码,看看我的内联 cmets

$var = "class iii";

echo upperCaseCustomFunction($var);

upperCaseCustomFunction($string) {

    $arr = explode(" ",$string);

    $stringPartOne = ucwords(strtolower($arr[0])); // will return Class 

    $stringPartTwo = strtoupper(strtolower($arr[1]));   // Will return III 

    return $tringPartOne." ".$stringPartTwo; // will return Class III

}

【讨论】:

  • 亲爱的,这只是我给出的一个例子,I、II、III 它并不总是出现在 $arr[1] 的位置上。像中考 III 或中考 IV
【解决方案4】:

ucwords 只会将字符串的第一个字符转换为大写。

您必须先找到所有 iii 或 iv 将其转换为大写,然后将 ucowrds 应用于整个字符串。

【讨论】:

    【解决方案5】:

    简单使用如下:

    $var = strtolower("class ") . strtoupper("iii");
    echo ucwords($var);
    

    //给出第三类

    【讨论】:

    • 我必须写多少个变量。我只是举个例子。
    【解决方案6】:

    试试这个

    <?php
    $var = "class iii";
    $var =  ucfirst(strtolower($var));
    echo str_replace(substr($var, 6), strtoupper(substr($var, 6)), $var);
    ?>
    

    输出:

    Class III
    

    【讨论】:

      猜你喜欢
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      相关资源
      最近更新 更多