ทำความสะอาด URL - นามแฝงเส้นทางอัตโนมัติ - วิธีลบสำเนียง (ÁÉÓÍÑ) ออกจาก URL อย่างไร


19

ฉันกำลังใช้ Drupal 7.9 และ pathauto 7.x-1.0-rc2

ฉันต้องการลบสำเนียงออกจากเส้นทางและแทนที่ด้วยตัวอักษรปกติ

Á=A
É=E
Ó=O
Í=I
Ñ=N

เป็นต้น

ฉันใช้ประเภทฟิลด์อนุกรมวิธานและชื่อโหนดเพื่อสร้างเส้นทาง:

[node:field_provincia]/[node:title]

ส่งผลให้เกิดเช่นávila / mérida

pathauto มี hooks บางชนิดที่ฉันสามารถใช้เพื่อใช้ฟังก์ชั่นนี้หรือไม่?

function removeAccents($str)
{
  $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā', 'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď', 'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ', 'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ', 'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ', 'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ', 'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ', 'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ', 'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż', 'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ', 'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ');
  $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's', 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
  return str_replace($a, $b, $str);
}

ปัญหาที่เกี่ยวข้องในคิว pathauto ของ
Adam Balsam

คำตอบ:


18

คุณเคยเห็นโมดูลการถอดเสียงไหม? สรุปโครงการบอกว่าสามารถใช้กับ pathauto 2.x เพื่อใช้การทับศัพท์ URL


นี่คือสิ่งที่ฉันใช้และทำงานได้อย่างสวยงาม ฉันยังมีปัญหาอื่นเกี่ยวกับ "ŠŒŽšœžŸ¥¥ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíìñîïðóîïðíîïðñõóôõöøõúûúûüÿÿ" ในขณะที่ใช้ฟังก์ชั่นอีเมลของ Drupal เช่นกัน
Citricguy

2
แต่ปัญหาคือมันเปลี่ยน chars ภาษาทั้งหมดใน URL เป็นภาษาอังกฤษที่ดูแปลก ตัวอย่างเช่นרשימהשלמדינותבעולםในภาษาฮิบรูกลายเป็น / rshymh-shl-mdynvt-bvlm OP กำลังถามวิธีลบตัวอักษรที่เน้นเสียงเท่านั้น
AgA

@AgA คุณสามารถปรับแต่งสิ่งที่มันทับศัพท์โดยแฮ็คไฟล์ที่มาพร้อมกับโมดูล (หรือแทนที่มันเป็น OOP ถ้าฉันจำได้อย่างถูกต้อง)
Capi Etheriel

14

วิธีที่ง่ายที่สุดในการดำเนินการนี้ยังคงเป็นโมดูลการทับศัพท์

เพื่อตอบเฉพาะกับ " pathauto มี hooks บางชนิดที่ฉันสามารถใช้เพื่อใช้ฟังก์ชันนี้ " คุณสามารถใช้hook_pathauto_alias_alter () :

function YOURMODULE_pathauto_alias_alter(&$alias, &$context){
  $alias = removeAccents($alias);
}

function removeAccents($str){
  $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā', 'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď', 'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ', 'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ', 'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ', 'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ', 'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ', 'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ', 'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż', 'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ', 'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ');
  $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's', 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
  return str_replace($a, $b, $str);
}

เพียงปรับให้เข้า removeAccents() กับความต้องการด้านภาษาของคุณโดยเฉพาะ ... คุณจะพบกับฟังก์ชั่นมากมายที่พยายามเขียนรายการสำเนียงทุกประเภทดูที่เอาเครื่องหมายกำกับเสียงออกจากสตริงเช่น แต่ฉันเกรงว่าจะไม่มีสากล

นอกจากนี้ยังมีวิธีที่สวยงามในการถอดเสียงโดยใช้ฟังก์ชั่น php iconvซึ่งจะกำจัดการออกเสียงส่วนใหญ่ หากคุณได้รับเครื่องหมายคำถามในผลลัพธ์มันอาจจะสะดวกในการ setlocale ก่อน ในบริบท:

function YOURMODULE_pathauto_alias_alter(&$alias, &$context){
  setlocale(LC_CTYPE, 'es_ES');//Spanish Spain i.e
  $alias = iconv('UTF-8', 'ASCII//TRANSLIT', $alias);
}

แก้ไข: หลังจากอ่านความคิดเห็นฉันพบว่ามีประโยชน์ในการเพิ่มสิ่งนี้:


ขอบคุณ .. เหล่านี้เป็นตัวอักษรที่เน้นเสียงอย่างเดียวในโลกใช่ไหม คุณมีตัวอย่างการทำงานของ iconv use case หรือไม่?
AgA

ในการตั้งค่า pathauto ฉันได้เพิ่มÂ, Ã, Ä, À, Á, Å, Ç, Ç, É, É, Ë, Ë, Í, Ï, Ò, Ó, Ô, Õ , O, O, U, U, U, ü, Y, TH, SS, A, A, A, A, A, A, æ, C, E, E, E, e ฉันผมผมผม แต่ไม่ทราบว่าทำไมมันไม่ทำงาน
AgA


@AgA ฉันแก้ไขคำตอบเพื่อแสดงความคิดเห็นของคุณ การตั้งค่า Pathauto ไม่ใช่สถานที่ที่เหมาะสมในการระบุสำเนียงให้ล้างเนื่องจากฟิลด์ข้อความโลนคือ 'Strings to Remove' คุณควรลองใช้ hook_pathauto_alias_alter () ถ้าการถอดโมดูลไม่ตรงกับความต้องการของคุณ URL สะอาดเป็นเรื่องที่กว้างถ้าคุณพิจารณาตัวอักษรทั้งหมด, ฮินดี, กรีก, Cyrillic, ฮิบรู ...
Kojo

ฉันมักจะใช้โมดูลการถอดเสียงทำงานเหมือนเสน่ห์
gorie

4

ตามคำแนะนำและแหล่งที่มาของ Kojo จากที่นี่: /programming/3371697/replacing-accented-characters-php - ฉันใช้รหัสนี้ซึ่งดูเหมือนว่าจะทำงานได้ดี:

function mymodule_pathauto_alias_alter(&$alias, &$context) {        
    removeAccents($alias);        
}

function removeAccents(&$str) {
    $unwanted_array = array('Š' => 'S', 'š' => 's', 'Ž' => 'Z', 'ž' => 'z', 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A', 'Æ' => 'A', 'Ç' => 'C', 'È' => 'E', 'É' => 'E',
        'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ø' => 'O', 'Ù' => 'U',
        'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y', 'Þ' => 'B', 'ß' => 'Ss', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'a', 'ç' => 'c',
        'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ð' => 'o', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o',
        'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ý' => 'y', 'ý' => 'y', 'þ' => 'b', 'ÿ' => 'y',
        'G' => 'G', 'I' => 'I', 'S' => 'S', 'g' => 'g', 'i' => 'i', 's' => 's', 'ü' => 'u',
        'a' => 'a', 'A' => 'A', '?' => 's', '?' => 'S', '?' => 't', '?' => 'T'
    );
    $str = strtr($str, $unwanted_array);

}

ฉันได้เพิ่มตัวอักษรตุรกีและโรมาเนียเช่นเดียวกับในความคิดเห็นโพสต์

ฉันไม่ต้องการใช้ iconv ตามที่แนะนำโดย Kojo เป็นหลักเพราะสถานที่จะต้องมีการตั้งค่าและมีการเพิ่มภาระในการเหรียญสตริงสถานที่


0

คุณสามารถใช้ pathauto_cleanstring () เพื่อลบอักขระเน้นเสียงจาก URL

function MYMODULE_pathauto_alias_alter(&$alias, &$context) {
  if (isset($context['data']['node'])) {
    // Include the pathauto module.
    module_load_include('module', 'pathauto');
    // Clean up a string segment to be used in an URL alias.
    $alias = pathauto_cleanstring(preg_replace('/\s+/', '', $alias));
  }
}

ฉันลองใช้โมดูลของคุณแล้ว แต่มันไม่ทำงาน
Yuri

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