我创建了一个清除已发布标题的功能。
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"在所有首都。
我已经完成了将所有单词设为大写的第一部分,我只需要在括号之间做任何事情。
答案 0 :(得分:5)
不要尝试构建单个函数来处理所有可能的情况。只是不要。这是毫无意义。在您的函数中,您尝试通过删除某些字符来“ clean ”字符串。 你不能通过删除一组字符来清理字符串。这个想法是有缺陷的,因为你总是不得不允许使用某些语法或其他特殊字符。
相反,根据将要使用的上下文处理字符串。例如:
如果要在SQL查询中使用此字符串,则必须使用预准备语句(或mysqli_real_escape_string()
)来正确转义数据。
如果要在HTML标记中输出此值,则需要使用htmlspecialchars()
来转义数据。
如果您要将其用作命令行参数,则需要使用escapeshellcmd()
或escapeshellarg()
。
使用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);
}