2012-05-08 36 views
8

Tôi đang sử dụng chức năng này để chuyển đổi CamelCase chuỗi tiêu tan:camelCase để dash - hai thủ đô cạnh nhau

function camel2dashed($className) { 
    return strtolower(preg_replace('/([^A-Z-])([A-Z])/', '$1-$2', $className)); 
} 

nó kinda hoạt động nhưng theres vấn đề khi tôi có cho ex. chuỗi này: getADog. Nó trả về get-adog nhưng tôi muốn get-a-dog

Tôi nên thay đổi mã của mình bằng cách nào? Cảm ơn

+2

Bạn đã cân nhắc xem bạn có muốn hai chữ cái viết hoa cạnh nhau không? Ví dụ, companyHQ cho trụ sở công ty? Bạn sẽ không muốn công ty-h-q, phải không? – jedmao

+0

trong trường hợp này bạn nói đúng nhưng điều đó sẽ không xảy ra. thanks – simPod

+0

Đây không phải là camelCase. Đó là PascalCase btw. –

Trả lời

26

Sử dụng một lookahead assertion:

function camel2dashed($className) { 
    return strtolower(preg_replace('/([a-zA-Z])(?=[A-Z])/', '$1-', $className)); 
} 

Xem nó làm việc trực tuyến: ideone

6

Bạn không cần một sự khẳng định lookahead để làm điều này nếu bạn biết rằng chuỗi của bạn không bắt đầu bằng một trên chữ cái viết hoa, bạn chỉ có thể chèn dấu gạch nối trước mỗi chữ cái viết hoa như sau:

function camel2dashed($className) { 
    return strtolower(preg_replace('/([A-Z])/', '-$1', $className)); 
} 

Điều này vẫn không xử lý các trường hợp như @sfjedi "companyHQ" -> "company-hq". Đối với điều đó, bạn phải kiểm tra rõ ràng cho các phần tử được phép viết hoa không được chia nhỏ hoặc chỉ định một số quy tắc chung (ví dụ: không thêm dấu gạch nối trước ký tự cuối cùng).

Bạn có thể tìm thấy một số giải pháp thay thế phức tạp hơn trong câu trả lời cho số virtual duplicate question này.

Các vấn đề liên quan