2

私は文字列操作が初めてで、リスト内の値を置き換えようとしています。

修正しようとしている 2 つの入力はMCAFEEとですPORT O'BRIAN

だから私は走りucwords(strtolower($rawTitle))ます。しかし今、私はMcafeePort O'brianを表示する必要があるときにMcAfeeとを持っていPort O'Brianます。

最初に焦点を当てるとPort O'brian、これは私の試みですが、文字列の3番目の文字が大文字になり、3番目に一致した文字が大文字になるため、明らかに機能しません:(

$oPattern = "/O\'[a-z]/"; //Pattern to match
$doesMatch = preg_match($oPattern, $output, $matches); //Do I need to the perform operation?
if ($doesMatch == 1) {
    $letters = str_split($output);//break it out into an array
    $cappedLetter = strtoupper($letters[2]);//capitalize the 3rd letter
    $output = preg_replace("/O'$letters[2]/", $output, "O'$cappedLetter");//replace the O'x with O'X
    return $output;
}

ここで使用する必要がある別の機能はありますか?

4

3 に答える 3

2

いいえ、大文字と小文字の情報が文字列にない場合、これを行う一般的な方法はありません。(たとえば、姓 O'Hara/O'hara の 2 つの可能なケースを考えてみてください。) できる限り試してみてください。

$title = ucwords(strtolower($rawTitle));
$title = preg_replace_callback('/(?<=O\'|Mc)./', function($match) {
    return strtoupper($match[0]);
}, $title);

ただし、後で手動で確認してください。

于 2012-12-26T19:52:50.630 に答える
0

このソリューションを投げ出す..配列関数を利用して、探していたケーシングで名前を作成します。汚れていますが、迅速かつ効果的です。

1) ' で分割

2) 項目を大文字にするarray_walk()

3) 内破する。

4) スペースについても同じことを行います

function nameFix(&$name, $key)
{
    $name = ucfirst($name);
}

function nameFixer($name)
{
    $array = explode(" ", $name);
    array_walk(
            $array, 
            function (&$name, $key) { 
                $name = explode("'", $name); 
                array_walk($name, 'nameFix'); 
                $name = implode("'", $name); 
            }
    );
    array_walk($array, nameFix);
    return implode(" ", $array);
}

echo nameFixer("mister port o'hare o'brian fredrickson"); 
// Returns: Mister Port O'Hare O'Brian Fredrickson
于 2012-12-26T20:08:09.880 に答える