2010-07-18 7 views
5

Ngay bây giờ, tôi đang thực hiện điều này với một tách, lát, và nổ:nổ UpperCasedCamelCase Upper cased Camel Trường hợp trong PHP

$exploded = implode(' ',array_slice(preg_split('/(?=[A-Z])/','ThisIsATest'),1)); 
//$exploded = "This Is A Test" 

đẹp hơn phiên bản:

$capital_split = preg_split('/(?=[A-Z])/','ThisIsATest'); 
$blank_first_ignored = array_slice($capital_split,1); 
$exploded = implode(' ',$blank_first_ignored); 

Tuy nhiên, vấn đề là khi bạn có đầu vào như 'SometimesPDFFilesHappen', việc triển khai của tôi sẽ (không chính xác) diễn giải là 'Sometimes P D F Files Happen'.

Làm cách nào để tôi có thể (đơn giản) lấy tập lệnh của tôi để ngưng tụ 'P D F' thành 'PDF'?

Chứng chỉ của tôi về thời điểm chia tách sẽ bắt đầu ở thủ đô đầu tiên và kết thúc một lần trước khi kết thúc, để phù hợp với từ tiếp theo.

Có, tôi biết có một số sự mơ hồ, như trong 'ThisIsAPDFTest', được hiểu là 'This Is APDF Test'. Tuy nhiên, tôi không thể nghĩ ra một cách "thông minh" để tránh điều này, vì vậy nó là một thỏa hiệp có thể chấp nhận được.

+0

Xem thêm: http://stackoverflow.com/questions/3103730/is-there-a-elegant-way-to-parse-a-word-and-add-spaces-before-capital-letters/3103795 # 3103795 –

Trả lời

10
$input = "SomePDFFile"; 

$pass1 = preg_replace("/([a-z])([A-Z])/","\\1 \\2",$input); 
$pass2 = preg_replace("/([A-Z])([A-Z][a-z])/","\\1 \\2",$pass1); 
echo $pass2; 

hoặc, nếu bạn là người rất sùng đạo về việc có 1 tuyên bố:

preg_replace("/(([a-z])([A-Z])|([A-Z])([A-Z][a-z]))/","\\2\\4 \\3\\5",$input); 

mà là rất xấu xí.

+1

+1 bạn đã lưu tôi viết một câu hỏi và sau đó bị tát cho một bản sao. – zaf

+0

++; Cảm ơn bạn, điều này đã vượt qua tất cả các bài kiểm tra đơn vị của tôi mà các thuật toán khác không thành công. Tôi thực sự cần phải học regex. – Dolph

+0

Đã thêm một bài kiểm tra đơn vị cho mục đích của riêng tôi và thay thế đối số đầu tiên trên pass1 bằng "/ ([a-z]) ([A-Z] [a-z]) /" để ngăn chặn "FoO" bị thay thế bằng "Fo O". – Dolph