แปลง Dashes เป็น CamelCase ใน PHP


93

ใครช่วยฉันทำฟังก์ชัน PHP นี้ให้สมบูรณ์ได้ไหม ฉันต้องการใช้สตริงแบบนี้: 'this-is-a-string' และแปลงเป็นสิ่งนี้: 'thisIsAString':

function dashesToCamelCase($string, $capitalizeFirstCharacter = false) {
    // Do stuff


    return $string;
}

คำตอบ:


187

ไม่จำเป็นต้องใช้นิพจน์ทั่วไปหรือการเรียกกลับ งานเกือบทั้งหมดสามารถทำได้ด้วย ucwords:

function dashesToCamelCase($string, $capitalizeFirstCharacter = false) 
{

    $str = str_replace(' ', '', ucwords(str_replace('-', ' ', $string)));

    if (!$capitalizeFirstCharacter) {
        $str[0] = strtolower($str[0]);
    }

    return $str;
}

echo dashesToCamelCase('this-is-a-string');

หากคุณใช้ PHP> = 5.3 คุณสามารถใช้ lcfirst แทน strtolower ได้

อัปเดต

พารามิเตอร์ที่สองถูกเพิ่มลงใน ucwords ใน PHP 5.4.32 / 5.5.16 ซึ่งหมายความว่าเราไม่จำเป็นต้องเปลี่ยนขีดกลางเป็นช่องว่างก่อน (ขอบคุณ Lars Ebert และ PeterM ที่ชี้ให้เห็น) นี่คือรหัสที่อัปเดต:

function dashesToCamelCase($string, $capitalizeFirstCharacter = false) 
{

    $str = str_replace('-', '', ucwords($string, '-'));

    if (!$capitalizeFirstCharacter) {
        $str = lcfirst($str);
    }

    return $str;
}

echo dashesToCamelCase('this-is-a-string');

18
if (!$capitalizeFirstCharacter) { $str = lcfirst($str); }
AVProgrammer

3
โปรดทราบว่าucwordsยอมรับตัวคั่นเป็นพารามิเตอร์ที่สอง (ดูคำตอบของ PeterM ) ดังนั้นหนึ่งในการstr_replaceเรียกจะไม่จำเป็น
Lars Ebert

ขอบคุณสำหรับข้อมูล @LarsEbert ฉันได้อัปเดตคำตอบแล้ว
webbiedave

เงื่อนไขสามารถเขียนใหม่ได้ด้วยการใช้ตัวดำเนินการ ternary $str = ! $capitalizeFirstCharacter ? lcfirst($str) : $str;เป็นหลักเพื่อความสามารถในการอ่าน (แม้ว่าบางคนอาจไม่เห็นด้วย) และ / หรือลดความซับซ้อนของโค้ด
Chris Athanasiadis

55

สิ่งนี้สามารถทำได้อย่างง่ายดายโดยใช้ucwordsซึ่งยอมรับตัวคั่นเป็นพารามิเตอร์:

function camelize($input, $separator = '_')
{
    return str_replace($separator, '', ucwords($input, $separator));
}

หมายเหตุ:ต้องการ php อย่างน้อย 5.4.32, 5.5.16


33
สิ่งนี้จะคืนค่าบางอย่างเช่น CamelCase - หากคุณต้องการให้เป็นเช่น camelCase แล้ว:return str_replace($separator, '', lcfirst(ucwords($input, $separator)));
Jeff S.

ucwordsมีพารามิเตอร์ที่สองdelimiterจึงstr_replace("_", "", ucwords($input, "_"));ดีพอ (ในกรณีส่วนใหญ่: P
wbswjc

8

นี่คือรูปแบบของฉันเกี่ยวกับวิธีจัดการกับมัน ที่นี่ฉันมีสองฟังก์ชั่นหนึ่งcamelCase ตัวแรกเปลี่ยนทุกอย่างให้เป็น camelCase และมันจะไม่ยุ่งถ้าตัวแปรมี cameCase อยู่แล้ว UncamelCaseที่สองเปลี่ยน camelCase เป็นขีดล่าง (คุณสมบัติที่ยอดเยี่ยมเมื่อจัดการกับคีย์ฐานข้อมูล)

function camelCase($str) {
    $i = array("-","_");
    $str = preg_replace('/([a-z])([A-Z])/', "\\1 \\2", $str);
    $str = preg_replace('@[^a-zA-Z0-9\-_ ]+@', '', $str);
    $str = str_replace($i, ' ', $str);
    $str = str_replace(' ', '', ucwords(strtolower($str)));
    $str = strtolower(substr($str,0,1)).substr($str,1);
    return $str;
}
function uncamelCase($str) {
    $str = preg_replace('/([a-z])([A-Z])/', "\\1_\\2", $str);
    $str = strtolower($str);
    return $str;
}

ให้ทดสอบทั้งสอง:

$camel = camelCase("James_LIKES-camelCase");
$uncamel = uncamelCase($camel);
echo $camel." ".$uncamel;

ฟังก์ชันนี้ส่งคืน jamesLikesCameAse สำหรับ camelCase แทน jamesLikesCameCase
Alari Truuts

8

ซับเดียวเกินพิกัดพร้อม doc block ...

/**
 * Convert underscore_strings to camelCase (medial capitals).
 *
 * @param {string} $str
 *
 * @return {string}
 */
function snakeToCamel ($str) {
  // Remove underscores, capitalize words, squash, lowercase first.
  return lcfirst(str_replace(' ', '', ucwords(str_replace('_', ' ', $str))));
}

สิ่งนี้จะกลับมาnull
PeterM

ฟังก์ชั่นขาดreturn... อัปเดตขอบคุณ นี่คือลิงค์สำหรับทดสอบ3v4l.org/YBHPd
doublejosh

6
ง่ายขึ้นมีเพื่อนเพียงแค่พลาดการกลับมา คิดบวกกับ SO
doublejosh

5

ฉันอาจจะใช้preg_replace_callback()เช่นนี้:

function dashesToCamelCase($string, $capitalizeFirstCharacter = false) {
  return preg_replace_callback("/-[a-zA-Z]/", 'removeDashAndCapitalize', $string);
}

function removeDashAndCapitalize($matches) {
  return strtoupper($matches[0][1]);
}


4
function camelize($input, $separator = '_')
{
    return lcfirst(str_replace($separator, '', ucwords($input, $separator)));
}

echo ($this->camelize('someWeir-d-string'));
// output: 'someWeirdString';

3
$string = explode( "-", $string );
$first = true;
foreach( $string as &$v ) {
    if( $first ) {
        $first = false;
        continue;
    }
    $v = ucfirst( $v );
}
return implode( "", $string );

รหัสที่ยังไม่ทดสอบ ตรวจสอบเอกสาร PHP สำหรับฟังก์ชัน im- / explode และ ucfirst


3

หนึ่งซับ PHP> = 5.3:

$camelCase = lcfirst(join(array_map('ucfirst', explode('-', $url))));

1
โปรดเพิ่มคำอธิบายว่าสิ่งนี้สามารถ / จะช่วย OP ได้อย่างไร
davejal

2

นี่คือวิธีแก้ปัญหาที่ง่ายมากในโค้ดบรรทัดเดียว

    $string='this-is-a-string' ;

   echo   str_replace('-', '', ucwords($string, "-"));

เอาต์พุต ThisIsAString


1

หรือหากคุณไม่ต้องการจัดการกับ regex และต้องการหลีกเลี่ยงการวนซ้ำอย่างชัดเจน :

// $key = 'some-text', after transformation someText            
$key = lcfirst(implode('', array_map(function ($key) {
    return ucfirst($key);
}, explode('-', $key))));


1

ไลบรารี TurboCommons มีเมธอด formatCase () วัตถุประสงค์ทั่วไปภายในคลาส StringUtils ซึ่งช่วยให้คุณสามารถแปลงสตริงเป็นรูปแบบเคสทั่วไปได้มากมายเช่น CamelCase, UpperCamelCase, LowerCamelCase, snake_case, Title Case และอื่น ๆ อีกมากมาย

https://github.com/edertone/TurboCommons

ในการใช้งานให้นำเข้าไฟล์ phar ไปยังโครงการของคุณและ:

use org\turbocommons\src\main\php\utils\StringUtils;

echo StringUtils::formatCase('sNake_Case', StringUtils::FORMAT_CAMEL_CASE);

// will output 'sNakeCase'

นี่คือลิงค์ไปยังซอร์สโค้ดวิธีการ:

https://github.com/edertone/TurboCommons/blob/b2e015cf89c8dbe372a5f5515e7d9763f45eba76/TurboCommons-Php/src/main/php/utils/StringUtils.php#L653




0
function camelCase($text) {
    return array_reduce(
         explode('-', strtolower($text)),
         function ($carry, $value) {
             $carry .= ucfirst($value);
             return $carry;
         },
         '');
}

เห็นได้ชัดว่าถ้าตัวคั่นอื่นที่ไม่ใช่ '-' เช่น '_' จะจับคู่ด้วยก็จะไม่ได้ผลดังนั้น preg_replace สามารถแปลงตัวคั่นทั้งหมด (ต่อเนื่องกัน) เป็น '-' ใน $ text ก่อน ...


ฉันไม่เห็นว่าวิธีนี้ง่ายกว่าชัดเจนหรือดีกว่าวิธีการแก้ปัญหาที่มีให้ (และเป็นที่ยอมรับ) เมื่อประมาณ 4 ปีที่แล้ว
ccjmne


0

นี่คืออีกทางเลือกหนึ่ง:

private function camelcase($input, $separator = '-')     
{
    $array = explode($separator, $input);

    $parts = array_map('ucwords', $array);

    return implode('', $parts);
}

0

$stringWithDash = 'Pending-Seller-Confirmation'; $camelize = str_replace('-', '', ucwords($stringWithDash, '-')); echo $camelize; เอาต์พุต: PendingSellerConfirmation

ucwordsพารามิเตอร์ที่สอง (ทางเลือก) ช่วยในการระบุตัวคั่นเพื่อปรับขนาดสตริง str_replaceใช้เพื่อสรุปผลลัพธ์โดยการลบตัวคั่น


0

นี่คือฟังก์ชันตัวช่วยขนาดเล็กโดยใช้วิธีarray_reduce ที่ใช้งานได้ ต้องการอย่างน้อย PHP 7.0

private function toCamelCase(string $stringToTransform, string $delimiter = '_'): string
{
    return array_reduce(
        explode($delimiter, $stringToTransform),
        function ($carry, string $part): string {
            return $carry === null ? $part: $carry . ucfirst($part);
        }
    );
}

0

วิธีแก้ปัญหาที่ดีมากมายข้างต้นและฉันสามารถให้วิธีอื่นที่ไม่มีใครพูดถึงมาก่อน ตัวอย่างนี้ใช้อาร์เรย์ ผมใช้วิธีนี้ในโครงการของฉันShieldon Firewall

/**
 * Covert string with dashes into camel-case string.
 *
 * @param string $string A string with dashes.
 *
 * @return string
 */
function getCamelCase(string $string = '')
{
    $str = explode('-', $string);
    $str = implode('', array_map(function($word) {
        return ucwords($word); 
    }, $str));

    return $str;
}

ทดสอบ:

echo getCamelCase('This-is-example');

ผลลัพธ์:

ThisIsExample

0
private function dashesToCamelCase($string)
{
    $explode = explode('-', $string);
    $return = '';
    foreach ($explode as $item) $return .= ucfirst($item);

    return lcfirst($return);
}


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.