PHP String Manipulation,可能是RegEx?

时间:2011-10-24 18:32:48

标签: php regex string

$personInfo['mantra']是我正在与之合作的作品。我希望所有内容都大写,使用介词和文章的例外(例如'a','an','the'等)是否有一种有效的方法可以做到这一点?到目前为止,我这样做ucwords(strtolower($personInfo['mantra'])),但显然这并没有考虑介词和文章保持小写。

数据库中的咒语全部大写(例如“我想要我想要的方式”),并且有数千个,所以手动更改它们是不切实际的。举一个例子,我想要一句话:“我想通过我想要的方式”成为'我想要的方式'。

4 个答案:

答案 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在这里我没有解决方案。