2010-05-07 39 views
54

Ai đó có thể giúp tôi hoàn thành chức năng PHP này không? Tôi muốn lấy một chuỗi như thế này: 'này-là-một-string' và chuyển đổi nó như thế này: 'thisIsAString':Chuyển đổi dấu gạch ngang sang CamelCase trong PHP

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


    return $string; 
} 

Trả lời

108

Không regex hoặc callbacks cần thiết. Hầu như tất cả các công việc có thể được thực hiện với 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'); 

Nếu bạn đang sử dụng PHP> = 5.3, bạn có thể sử dụng lcfirst thay vì strtolower.

Cập nhật

Một tham số thứ hai được bổ sung vào ucwords trong PHP 5.4.32/5.5.16 có nghĩa là chúng ta không cần phải đầu tiên thay đổi dấu gạch ngang để không gian (nhờ Lars Ebert và PeterM cho trỏ này ra). Đây là mã Cập nhật:

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

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

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

    return $str; 
} 

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

'if (! $ CapitalizeFirstCharacter) { $ str = lcfirst ($ str); } ' – AVProgrammer

+2

Lưu ý rằng' ucwords' thực sự chấp nhận dấu phân tách làm tham số thứ hai (xem [answer by PeterM] (http://stackoverflow.com/a/33122760/2580794)), vì vậy một trong các lệnh gọi str_replace' sẽ là không cần thiết. –

+0

Cảm ơn thông tin @LarsEbert. Tôi đã cập nhật câu trả lời. – webbiedave

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

đang chưa được kiểm tra. Kiểm tra tài liệu PHP cho các chức năng im-/explode và ucfirst.

6

tôi có lẽ sẽ sử dụng preg_replace_callback(), như thế này:

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

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

Hãy thử điều này:

return preg_replace("/\-(.)/e", "strtoupper('\\1')", $string); 
+2

Trình sửa đổi/e không được chấp nhận trong PHP 5.5. –

+1

[Thông tin thêm về việc không sử dụng sửa đổi 'e'] (http://php.net/manual/en/reference.pcre.pattern.modifiers.php#reference.pcre.pattern.modifiers.eval) – fracz

-2

Đây là đơn giản:

$string = preg_replace('/-(.?)/e',"strtoupper('$1')", strtolower($string)); 
+0

Trình sửa đổi/e là không được chấp nhận trong PHP 5.5. –

5

đây là sự thay đổi của tôi về cách đối phó với nó. Ở đây tôi có hai hàm, đầu tiên là camelCase biến bất kỳ thứ gì thành camelCase và nó sẽ không lộn xộn nếu biến đã chứa hasCase. Thứ hai uncamelCase biến camelThêm vào dấu gạch dưới (tính năng tuyệt vời khi xử lý các khóa cơ sở dữ liệu).

function camelCase($str) { 
    $i = array("-","_"); 
    $str = preg_replace('/([a-z])([A-Z])/', "\\1 \\2", $str); 
    $str = preg_replace('@[^a-zA-Z0-9\-_ ][email protected]', '', $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; 
} 

cho phép kiểm tra cả hai:

$camel = camelCase("James_LIKES-camelCase"); 
$uncamel = uncamelCase($camel); 
echo $camel." ".$uncamel; 
0
function camelCase($text) { 
    return array_reduce(
     explode('-', strtolower($text)), 
     function ($carry, $value) { 
      $carry .= ucfirst($value); 
      return $carry; 
     }, 
     ''); 
} 

Rõ ràng, nếu delimiter khác hơn '-', ví dụ '_', cũng sẽ được so khớp, sau đó điều này sẽ không hoạt động, sau đó một preg_replace có thể chuyển đổi tất cả các dấu phân cách (liên tiếp) thành '-' trong $ text đầu tiên ...

+0

Tôi không thực sự thấy cách này đơn giản, rõ ràng hơn hay bằng cách nào tốt hơn giải pháp được cung cấp (và được chấp nhận) khoảng 4 năm trước. – ccjmne

1

Hoặc, nếu bạn không muốn xử lý với regex, và muốn tránh rõ ràng vòng:

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

bạn đang tìm kiếm preg_replace_callback, bạn có thể sử dụng nó như thế này:

$camelCase = preg_replace_callback('/-(.?)/', function($matches) { 
    return ucfirst($matches[1]); 
}, $dashes); 
0

chức năng này cũng tương tự như chức năng @ của Svens

function toCamelCase($str, $first_letter = false) { 
    $arr = explode('-', $str); 
    foreach ($arr as $key => $value) { 
     $cond = $key > 0 || $first_letter; 
     $arr[$key] = $cond ? ucfirst($value) : $value; 
    } 
    return implode('', $arr); 
} 

Nhưng rõ ràng hơn, (tôi nghĩ: D) và với thông số tùy chọn để viết hoa chữ cái đầu tiên hay không.

Cách sử dụng:

$dashes = 'function-test-camel-case'; 
$ex1 = toCamelCase($dashes); 
$ex2 = toCamelCase($dashes, true); 

var_dump($ex1); 
//string(21) "functionTestCamelCase" 
var_dump($ex2); 
//string(21) "FunctionTestCamelCase" 
27

Điều này có thể được thực hiện rất đơn giản, bu sử dụng ucwords mà chấp nhận delimiter như param:

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

LƯU Ý: Cần php ít nhất 5.4.32, 5.5. 16

+17

Điều này sẽ trả về một cái gì đó giống như CamelCase - nếu bạn muốn điều này giống như camelCase thì: 'return str_replace ($ separator, '', lcfirst (ucwords ($ input, $ separator)))' –

+0

gọi là PascalCase. bỏ phiếu cho giải pháp không phù hợp –

+0

@ Alex.Designworks cảm thấy tự do để cải thiện – PeterM

2

Một lớp lót, PHP> = 5.3:

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

xin vui lòng thêm một số giải thích làm thế nào điều này có thể/sẽ giúp OP – davejal

0

Một phương pháp đơn giản:

$nasty = [' ', '-', '"', "'"]; // array of nasty characted to be removed 
$cameled = lcfirst(str_replace($nasty, '', ucwords($string))); 
2

quá tải oneliner, với khối doc wrapper ...

/** 
* 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)))); 
} 
+0

Điều này sẽ trả về 'null' – PeterM

+0

Chức năng thiếu' return' ...cập nhật, cảm ơn. Đây là liên kết để kiểm tra https://3v4l.org/YBHPd – doublejosh

+0

Tốt này, tốt hơn nên đăng mã thực sự được kiểm tra. – PeterM

1

đây là giải pháp rất rất dễ dàng trong mã một dòng

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

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

đầu ra ThisIsAString

0

Nếu bạn sử dụng khung công tác Laravel, bạn có thể sử dụng phương thức camel_case().

camel_case('this-is-a-string') // 'thisIsAString' 
0

Thư viện TurboCommons chứa một mục đích chung formatCase() phương pháp bên trong lớp StringUtils, cho phép bạn chuyển đổi một chuỗi rất nhiều định dạng trường hợp thông thường, như CamelCase, UpperCamelCase, LowerCamelCase, snake_case, Tiêu đề Case, và nhiều hơn.

https://github.com/edertone/TurboCommons

Để sử dụng nó, hãy nhập tệp Phar để dự án của bạn và:

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

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

// will output 'sNakeCase' 
0

Dưới đây là một lựa chọn:

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

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

    return implode('', $parts); 
} 
Các vấn đề liên quan