Поэтому я пытаюсь создать пули для хранения в моей БД. Мои локали включают английский, некоторые европейские языки и японский.
Я допускаю \d
, \w
, европейские символы транслитерируются, японские символы нетронуты. Период, плюс и тире ( -
) сохраняются. Ведущее / конечное пустое пространство удаляется, а пробел между ними заменяется тире.
Вот несколько кодов: (пожалуйста, не стесняйтесь улучшать его, учитывая мои условия выше, поскольку мой regex-fu в настоящее время является белым поясом)
function ToSlug($string, $separator='-') { $url = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $string); $url = preg_replace('/[^\d\w一-龠ぁ-ゔァ-ヴー々〆〤.+ -]/', '', $url); $url = strtolower($url); $url = preg_replace('/[ ' . $separator . ']+/', $separator, $url); return $url; }
Я тестирую эту функцию, однако мои символы JP не проходят, их просто заменяют на ''
. Пока я подозреваю, что это //IGNORE
что их вынимает, мне нужно, чтобы их или мои транслитерации в Германии и Франции не сработали. Любые идеи о том, как я могу это исправить?
EDIT: Я не уверен, что японский кандзи покрывает все упрощенные китайцы, но мне это понадобится и корейский. Если кто-нибудь знает регулярное выражение с битой, пожалуйста, дайте мне знать, что это спасет меня некоторое время. Благодарю.
Примечание. Я не знаком с японской системой письма.
Глядя на функцию, появляется вызов iconv
чтобы удалить все японские символы. Вместо использования iconv
для транслитерации, может быть проще просто создать функцию, которая делает это:
function _toSlugTransliterate($string) { // Lowercase equivalents found at: // https://github.com/kohana/core/blob/3.3/master/utf8/transliterate_to_ascii.php $lower = [ 'à'=>'a','ô'=>'o','ď'=>'d','ḟ'=>'f','ë'=>'e','š'=>'s','ơ'=>'o', 'ß'=>'ss','ă'=>'a','ř'=>'r','ț'=>'t','ň'=>'n','ā'=>'a','ķ'=>'k', 'ŝ'=>'s','ỳ'=>'y','ņ'=>'n','ĺ'=>'l','ħ'=>'h','ṗ'=>'p','ó'=>'o', 'ú'=>'u','ě'=>'e','é'=>'e','ç'=>'c','ẁ'=>'w','ċ'=>'c','õ'=>'o', 'ṡ'=>'s','ø'=>'o','ģ'=>'g','ŧ'=>'t','ș'=>'s','ė'=>'e','ĉ'=>'c', 'ś'=>'s','î'=>'i','ű'=>'u','ć'=>'c','ę'=>'e','ŵ'=>'w','ṫ'=>'t', 'ū'=>'u','č'=>'c','ö'=>'o','è'=>'e','ŷ'=>'y','ą'=>'a','ł'=>'l', 'ų'=>'u','ů'=>'u','ş'=>'s','ğ'=>'g','ļ'=>'l','ƒ'=>'f','ž'=>'z', 'ẃ'=>'w','ḃ'=>'b','å'=>'a','ì'=>'i','ï'=>'i','ḋ'=>'d','ť'=>'t', 'ŗ'=>'r','ä'=>'a','í'=>'i','ŕ'=>'r','ê'=>'e','ü'=>'u','ò'=>'o', 'ē'=>'e','ñ'=>'n','ń'=>'n','ĥ'=>'h','ĝ'=>'g','đ'=>'d','ĵ'=>'j', 'ÿ'=>'y','ũ'=>'u','ŭ'=>'u','ư'=>'u','ţ'=>'t','ý'=>'y','ő'=>'o', 'â'=>'a','ľ'=>'l','ẅ'=>'w','ż'=>'z','ī'=>'i','ã'=>'a','ġ'=>'g', 'ṁ'=>'m','ō'=>'o','ĩ'=>'i','ù'=>'u','į'=>'i','ź'=>'z','á'=>'a', 'û'=>'u','þ'=>'th','ð'=>'dh','æ'=>'ae','µ'=>'u','ĕ'=>'e','ı'=>'i', ]; return str_replace(array_keys($lower), array_values($lower), $string); }
Таким образом, с некоторыми изменениями он может выглядеть примерно так:
function toSlug($string, $separator = '-') { // Work around this... #$string = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $string); $string = _toSlugTransliterate($string); // Remove unwanted chars + trim excess whitespace // I got the character ranges from the following URL: // https://stackoverflow.com/questions/6787716/regular-expression-for-japanese-characters#10508813 $regex = '/[^一-龠ぁ-ゔァ-ヴーa-zA-Z0-9a-zA-Z0-9々〆〤.+ -]|^\s+|\s+$/u'; $string = preg_replace($regex, '', $string); // Using the mb_* version seems safer for some reason $string = mb_strtolower($string); // Same as before $string = preg_replace("/[ {$separator}]+/", $separator, $string); return $string; } $x = ' æøå!this.ís-a test-ゔヴ ーァ '; echo toSlug($x);
В regex вы можете использовать «скрипты» юникода для соответствия букв разных языков. Нет «японского», но есть Hiragana
, Katakana
и Han
. Поскольку я понятия не имею, как написано японское, и как можно использовать их, я даже не собираюсь пытаться.
Однако использование этих сценариев будет сделано примерно так:
'/[\p{Hiragana}\p{Katakana}\p{Han}]+/'