$personInfo['mantra']
是我正在与之合作的作品。我希望所有内容都大写,使用介词和文章的例外(例如'a','an','the'等)是否有一种有效的方法可以做到这一点?到目前为止,我这样做ucwords(strtolower($personInfo['mantra']))
,但显然这并没有考虑介词和文章保持小写。
数据库中的咒语全部大写(例如“我想要我想要的方式”),并且有数千个,所以手动更改它们是不切实际的。举一个例子,我想要一句话:“我想通过我想要的方式”成为'我想要的方式'。
答案 0 :(得分:3)
这对正则表达式来说似乎不是一件容易的事。因为介词和文章不多,你不能在ucwords()后使用直接的str_replace吗?
$personInfo['mantra'] = ucwords(strtolower($personInfo['mantra']));
$personInfo['mantra'] = " " . $personInfo['mantra'] . " ";
$personInfo['mantra'] = str_replace(
array(" An ", " A ", " The "),
array(" an ", " a ", " the "),
$personInfo['mantra']);
$personInfo['mantra'] = trim($personInfo['mantra']);
在每个“咒语”的开头和结尾添加空格有助于确保str_replace可以正确替换。
你可以通过将所有需要的介词和文章放在一个数组中,循环遍历它并在每个数据库上执行str_replace来简化它。如果需要,可以使用preg_replace_callback进行正则表达式替代,但我认为它既慢又复杂。
答案 1 :(得分:1)
这是一种较慢,蛮力的方式来处理它。不是很优雅,但它可以完成工作:
<?php
$articles = array("a","an","the");
$prepositions = array("under","over","beside",etc...);
foreach($mantras as $key => $mantra) {
$words = explode(" ", strtolower($mantra));
$newmantra = "";
foreach($words as $word) {
if (!in_array($word, $articles) && !in_array($word, $prepositions)) {
$newmantra .= ucfirst($word)." ";
} else {
$newmantra .= $word." ";
}
}
$mantras[$key] = rtrim($newmantra);
}
?>
答案 2 :(得分:0)
我认为您可以先使用您的ucwords代码段,然后使用数据库系统的替换功能(这是?)来搜索和替换介词。
答案 3 :(得分:0)
我对此的处理方法是定义一个带有介词的数组,并对除了那些之外的所有单词进行操作。
但这比一个班轮更复杂。
regexp在这里我没有解决方案。