как КАПИТАЛИЗИРОВАТЬ всех остальных персонажей в php? - PullRequest
3 голосов
/ 23 августа 2011

Я хочу CaPiTaLiZe $ string в php, не спрашивайте почему: D

Я провел небольшое исследование и нашел здесь хорошие ответы, они действительно помогли мне. Но в моем случае я хочу начать использовать каждый нечетный символ (1,2,3 ...) в КАЖДОМ слове.

Например, с моей пользовательской функцией я получаю этот результат "TeSt eXaMpLe" и хочу получить этот "TeSt ExAmPlE". Видите, что во втором примере слово «пример» начинается с заглавной «Е»?

Так, кто-нибудь может мне помочь? :)

Ответы [ 5 ]

2 голосов
/ 23 августа 2011

Я бы использовал для этого регулярное выражение, так как это сжато и легко:

$str = 'I made some research and found good answers here, they really helped me.';
$str = preg_replace_callback('/(\w)(.?)/', 'altcase', $str);
echo $str;

function altcase($m){
    return strtoupper($m[1]).$m[2];
}

Выводы: «Я сделал так, чтобы научился и собирался ответить на эти вопросы, они действительно помогли мне».

Пример

2 голосов
/ 23 августа 2011

Ну, я бы просто сделал его массивом, а затем снова собрал его.

<?php

$str = "test example";

$str_implode = str_split($str);

$caps = true;
foreach($str_implode as $key=>$letter){
    if($caps){
        $out = strtoupper($letter);
        if($out <> " ") //not a space character
            $caps = false;
    }
    else{
        $out = strtolower($letter);
        $caps = true;
    }
    $str_implode[$key] = $out;
}

$str = implode('',$str_implode);

echo $str;

?>

Демонстрация: http://codepad.org/j8uXM97o

1 голос
/ 23 августа 2011

Попробуйте:

function capitalize($string){
    $return= "";
    foreach(explode(" ",$string) as $w){
        foreach(str_split($w) as $k=>$v) {
            if(($k+1)%2!=0 && ctype_alpha($v)){
                $return .= mb_strtoupper($v);
            }else{
                $return .= $v;
            }
        }
        $return .= " ";
    }
    return $return;
}
echo capitalize("I want to CaPiTaLiZe string in php, don't ask why :D");
//I WaNt To CaPiTaLiZe StRiNg In PhP, DoN'T AsK WhY :D

Отредактировано : исправлено отсутствие специальных символов в выводе.

1 голос
/ 23 августа 2011

Вот один лайнер, который должен работать.

preg_replace('/(\w)(.)?/e', "strtoupper('$1').strtolower('$2')", 'test example');

http://codepad.org/9LC3SzjC

0 голосов
/ 04 октября 2018

Эта задача может быть выполнена без использования групп захвата - просто используйте ucfirst().

Она не предназначена для обработки многобайтовых символов.

Захватите символ слова, а затем, при необходимости,следующий персонажИз совпадения полной строки измените регистр только первого символа.

Код: ( Демонстрация )

$strings = [
    "test string",
    "lado lomidze needs a solution",
    "I made some research and found 'good' answers here; they really helped me."
];  // if not already all lowercase, use strtolower()

var_export(preg_replace_callback('/\w.?/', function ($m) { return ucfirst($m[0]); }, $strings));

Выход:

array (
  0 => 'TeSt StRiNg',
  1 => 'LaDo LoMiDzE NeEdS A SoLuTiOn',
  2 => 'I MaDe SoMe ReSeArCh AnD FoUnD \'GoOd\' AnSwErS HeRe; ThEy ReAlLy HeLpEd Me.',
)

Для других исследователей, если вы (проще говоря) просто хотите преобразовать все остальные символы в верхний регистр, вы могли бы использовать /..?/ в своем шаблоне, но использование регулярных выражений для этого случая было бы излишним.Вы могли бы более эффективно использовать цикл for() и двойное приращение.

Код ( Демо )

$string = "test string";
for ($i = 0, $len = strlen($string); $i < $len; $i += 2) {
    $string[$i] = strtoupper($string[$i]);
}
echo $string;
// TeSt sTrInG
// ^-^-^-^-^-^-- strtoupper() was called here
...