在括号PHP之后的句子中大写一个单词

时间:2014-07-01 15:54:24

标签: php regex function preg-match preg-match-all

我创建了一个清除已发布标题的功能。

function title_var($title_variable) {
   $title_variable = mysql_real_escape_string(ucwords(strtolower(trim(htmlspecialchars($title_variable, ENT_QUOTES)))));
   return stripslashes($title_variable);
}

我现在需要能够在()或[]全部大写之间做任何事情。例如"我的公司名称(cbs)有限"或者"我的公司名称[cbs]有限",成为"我的公司名称(CBS)有限公司"," CBS"在所有首都。

我已经完成了将所有单词设为大写的第一部分,我只需要在括号之间做任何事情。

1 个答案:

答案 0 :(得分:5)

始终使用基于上下文的转义

不要尝试构建单个函数来处理所有可能的情况。只是不要。这是毫无意义。在您的函数中,您尝试通过删除某些字符来“ clean ”字符串。 你不能通过删除一组字符来清理字符串。这个想法是有缺陷的,因为你总是不得不允许使用某些语法或其他特殊字符。

相反,根据将要使用的上下文处理字符串。例如:


解决手头的问题

使用preg_replace_callback()来完成此任务。您可以使用以下正则表达式来匹配括号内的文本(包括括号):

[\(\[].*?[\)\]] 

说明:

  • [\(\[] - 匹配左括号
  • .*? - 匹配
  • 之间的文字
  • [\)\]] - 匹配结束括号

$m[0]将包含整个匹配的字符串。您可以使用strtoupper()将其转换为大写。

修改你的功能,它变成了:

function get_title($title) {
    $title = ucwords(strtolower(trim($title, ENT_QUOTES)));
    return preg_replace_callback('/[\(\[].*?[\)\]]/', function ($m) {
        return strtoupper($m[0]);
    }, $title);
}

Demo