2011-10-24 40 views
0

$personInfo['mantra']是我正在使用的一块。我希望一切都被大写,例外的介词和文章(例如“a”,“an”,“the”等)是否有一种有效的方法来做到这一点?到目前为止,我正在做这个ucwords(strtolower($personInfo['mantra'])),但显然这并没有考虑介词和剩余的小写字母。PHP字符串操作,可能是RegEx?

在数据库中,一个咒语全部大写(例如'我活着就是我想要的'),并且有成千上万,因此手动更改它们是不现实的。举一个例子,我想说一句“我活着就是我想要的”,成为“我活在我想要的样子”。

回答

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']); 

在每个'mantra'的开头和结尾添加空格有助于确保str_replace可以正确替换。

您可以通过将所有需要的介词和文章放入数组中,循环遍历它并在每个数组上执行str_replace来简化它。如果需要,使用preg_replace_callback的正则表达式可能是可能的,但我认为它会更慢更复杂。

+0

这样的声音可能是最好的情况下,我会在计时器到期后接受它。 :) – Matt

+1

'str_replace()'支持数组:'str_replace(数组''','An','The'),数组('a','an','the'),$ personInfo ['mantra' ])(注意在这一点上这些单词不再全是大写)。 – JJJ

0

我想你可以先用你的ucwords代码片段,然后用你的数据库系统的替换函数(这是?)来搜索和替换介词。

0

我的这种做法是定义一个带介词的数组,并且除了那些词之外的所有单词。

但是,这将比一个班轮更复杂。

regexp在这里我不相信。

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); 
} 

?>