2010-10-29 36 views
10

Kịch bản lệnh PHP thông dụng để xóa bất kỳ thứ gì không phải là chữ cái hoặc số 0 đến 9 và thay thế dấu cách thành dấu gạch ngang - thay đổi thành chữ thường. không - hoặc --- vvCụm từ thông dụng - bất kỳ văn bản nào tới URL thân thiện

Ví dụ:

Ví dụ: con cáo nâu nhanh chóng nhảy Kết quả: the-nhanh-nâu-fox-nhảy

Ví dụ: con cáo nâu nhanh chóng nhảy ! Kết quả: nhanh-nâu-cáo-nhảy

Ví dụ: Con cáo màu nâu nhanh - nhảy! Kết quả: nhanh-nâu-cáo-nhảy

Ví dụ: Nhanh ~ `! @ # $%^& *() _ + = ------- brown {} |] [:" ?.! '; <>,/fox - nhảy Kết quả: the-nhanh-nâu-fox-nhảy

Ví dụ: nhanh chóng 1234567890 ~ ​​`@ # $%^& *() _ + = - ----- nâu {} |] [: "'; <>?.,/Fox - đã nhảy! Kết quả: the-quick-1234567890-brown-fox-nhảy


Bất kỳ ai có ý tưởng về cụm từ thông dụng?

Cảm ơn!

+0

Bạn có thể muốn để lại dấu gạch nối khi chúng trực tiếp giữa các từ (ví dụ: "một số thứ" không được dịch thành "cái gì đó") và các trường hợp đặc biệt khác. –

Trả lời

27

Vì bạn dường như muốn tất cả các chuỗi ký tự không phải chữ số được thay thế bằng một gạch nối duy nhất, bạn có thể sử dụng này:

$str = preg_replace('/[^a-zA-Z0-9]+/', '-', $str); 

Nhưng điều này có thể dẫn đến dấu gạch nối ở đầu hoặc cuối có thể được loại bỏ bằng trim:

$str = trim($str, '-'); 

Và để chuyển đổi kết quả thành chữ thường, sử dụng strtolower:

$str = strtolower($str); 

Vì vậy, tất cả cùng nhau:

$str = strtolower($str); 
$str = trim($str, '-'); 
$str = preg_replace('/[^a-z0-9]+/', '-', $str); 

Hoặc trong một nhỏ gọn một liner:

$str = strtolower(trim(preg_replace('/[^a-zA-Z0-9]+/', '-', $str), '-')); 
+0

Cảm ơn! Hoạt động tuyệt vời! – Paul

+2

Tôi nghĩ một giải pháp thay thế tốt hơn là thay thế khoảng trắng trước, sau đó không thay thế khoảng trắng/không phải chữ số. Trong nhiều trường hợp, không phải khoảng trắng, các ký tự không phải chữ và số không phải là dấu gạch ngang. Tức là: "Đêm của phụ nữ" sẽ là "phụ nữ-s-đêm". Lần đầu tiên tôi sẽ thay thế khoảng trắng ('/ \ s + /') bằng dấu gạch ngang, sau đó thay thế tất cả khác ('/ [^ a-zA-Z0-9] + /') bằng một chuỗi rỗng. Bạn cũng có thể bỏ qua phần cắt. –

+0

Chỉnh sửa ở trên: Bạn sẽ cần thêm dấu gạch ngang vào thay thế thứ hai: '/ [^ a-zA-Z0-9 \ -] + /' –

17

tôi chỉ làm việc với một cái gì đó tương tự, và tôi đến với mảnh này ít mã , nó cũng dự tính việc sử dụng các ký tự latin.

Đây là chuỗi mẫu:

$str = 'El veloz murciélago hindú comía fe<!>&@#$%&!"#%&?¡?*liz cardillo y kiwi. La cigüeña ¨^;.-|°¬tocaba el saxofón detrás del palenque de paja';

Trước tiên tôi chuyển đổi chuỗi thành htmlentities chỉ để làm cho nó dễ dàng hơn để sử dụng sau này.

$friendlyURL = htmlentities($str, ENT_COMPAT, "UTF-8", false);

Sau đó, tôi thay thế ký tự Latin với các nhân vật ascii tương ứng của họ (á trở thành a, Ü trở thành U, và vân vân):

$friendlyURL = preg_replace('/&([a-z]{1,2})(?:acute|circ|lig|grave|ring|tilde|uml|cedil|caron);/i','\1',$friendlyURL);

Sau đó, tôi chuyển đổi chuỗi lại từ html thực thể để biểu tượng, một lần nữa để sử dụng dễ dàng hơn sau này.

$friendlyURL = html_entity_decode($friendlyURL,ENT_COMPAT, "UTF-8");

Tiếp theo, tôi thay thế tất cả các ký tự không tự chữ và số vào dấu gạch ngang.

$friendlyURL = preg_replace('/[^a-z0-9-]+/i', '-', $friendlyURL);

tôi loại bỏ dấu gạch nối thêm bên trong chuỗi:

$friendlyURL = preg_replace('/-+/', '-', $friendlyURL);

tôi loại bỏ đầu và đuôi có dấu gạch nối:

$friendlyURL = trim($friendlyURL, '-');

Và cuối cùng chuyển đổi tất cả thành chữ thường:

$friendlyURL = strtolower($friendlyURL);

Tất cả với nhau:

function friendlyUrl ($str = '') { 

    $friendlyURL = htmlentities($str, ENT_COMPAT, "UTF-8", false); 
    $friendlyURL = preg_replace('/&([a-z]{1,2})(?:acute|circ|lig|grave|ring|tilde|uml|cedil|caron);/i','\1',$friendlyURL); 
    $friendlyURL = html_entity_decode($friendlyURL,ENT_COMPAT, "UTF-8"); 
    $friendlyURL = preg_replace('/[^a-z0-9-]+/i', '-', $friendlyURL); 
    $friendlyURL = preg_replace('/-+/', '-', $friendlyURL); 
    $friendlyURL = trim($friendlyURL, '-'); 
    $friendlyURL = strtolower($friendlyURL); 
    return $friendlyURL; 

} 

Test:

$str = 'El veloz murciélago hindú comía fe<!>&@#$%&!"#%&-?¡?*-liz cardillo y kiwi. La cigüeña ¨^`;.-|°¬tocaba el saxofón detrás del palenque de paja'; 

echo friendlyUrl($str); 

Kết quả:

el-veloz-murcielago-hindu-comia-fe-liz-cardillo-y-kiwi-la-ciguena-tocaba-el-saxofon-detras-del-palenque-de-paja 

Tôi đoán câu trả lời Gumbo của phù hợp với vấn đề của bạn tốt hơn, và đó là một mã ngắn hơn, nhưng tôi nghĩ nó sẽ hữu ích cho người khác.

Chúc mừng, Adriana

+0

Hoàn hảo !!!!!!!! – Leonardo

+0

Hoạt động hoàn hảo! Cứu mạng tôi! Cảm ơn! – vinigarcia87

+0

5 năm sau nó vẫn hoạt động như một sự quyến rũ. Dễ dàng, đơn giản, tôi thích nó. Cảm ơn ngài! – LuBre

1

Nếu bạn đang sử dụng này cho tên tập tin trong PHP, câu trả lời của Gumbo sẽ

$str = preg_replace('/[^a-zA-Z0-9.]+/', '-', $str); 
$str = trim($str, '-'); 
$str = strtolower($str); 

gia tăng trong thời gian cho tên tập tin và nó strtolower(), không strtolowercase().

6

Trong một hàm:

function sanitize_text_for_urls ($str) 
{ 
    return trim(strtolower(preg_replace(
     array('/[^a-z0-9-\s]/ui', '/\s/', '/-+/'), 
     array('', '-', '-'), 
     iconv('UTF-8', 'ASCII//TRANSLIT', $str))), '-'); 
} 

Những gì nó:

// Solve accents and diacritics 
$str = iconv('UTF-8', 'ASCII//TRANSLIT', $str); 

// Leave only alphanumeric (respect existing hyphens) 
$str = preg_replace('/[^a-z0-9-\s]/ui', '', $str); 

// Turn spaces to hyphens 
$str = preg_replace('/\s+/', '-', $str); 

// Remove duplicate hyphens 
$str = preg_replace('/-+/', '-', $str); 

// Remove trailing hyphens 
$str = trim($str, '-'); 

// Turn to lowercase 
$str = strtolower($str); 

Lưu ý:
Bạn có thể kết hợp nhiều preg_replace bằng cách thông qua một mảng. Xem hàm ở trên cùng.

Ví dụ:

// Électricité, plâtrerie --> electricite-platrerie 
// St. Lücie-Pétêrès   --> st-lucie-peteres 
// -Façade- & gros œuvre  --> facade-gros-oeuvre 

// _-Thè quîck ~`[email protected]#&$%^ &*()_+= ---{}|][ :"; <>?.,/ fóx - jümpëd_- 
// the-quick-fox-jumped 

EDIT: thêm "/ u" ở cuối của regex để sử dụng UTF8
EDIT: chiếm trùng lặp và hàng đầu/đuôi có dấu gạch nối, nhờ @LuBre

+0

Tôi nghĩ rằng đó là giải pháp tốt nhất cho đến nay. – barell

+0

Đẹp nhất, tôi chỉ cần thêm '$ str = preg_replace ('/ - + /', '-', $ str)' để loại bỏ bất kỳ khoảng trống liên tiếp nào có thể. Ví dụ: 'hello-how --- are-you' sẽ được chuyển thành' hello-how-are-you'. – LuBre

+0

Cảm ơn @LuBre, tôi đã kết hợp phản hồi của bạn – gabssnake

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