регулярное выражение для соответствия любому символу UTF, кроме знаков препинания - PullRequest
3 голосов
/ 12 апреля 2009

Я готовлю функцию в PHP для автоматического преобразования строки, которая будет использоваться в качестве имени файла в URL (* .html). Хотя ASCII следует использовать, чтобы быть в безопасности, для нужд SEO мне нужно разрешить имя файла на любом языке, но я не хочу, чтобы оно включало знаки препинания, кроме тире (-) и подчеркивания (_), символов как *% $ # @ "'не должно быть разрешено.

Пробелы должны быть преобразованы в тире.

Я думаю, что использование Regex будет самым простым способом, но я не уверен, как обращаться со строками UTF8.

Мои функции ASCII выглядят так:

function convertToPath($string)
{
    $string = strtolower(trim($string));
    $string = preg_replace('/[^a-z0-9-]/', '-', $string);
    $string = preg_replace('/-+/', "-", $string);
    return $string;
}

Спасибо

Рой.

Ответы [ 2 ]

4 голосов
/ 12 апреля 2009

Я думаю, что для нужд SEO вы должны придерживаться символов ASCII в URL.

Теоретически, в URL допускается гораздо больше символов. На практике большинство систем ASCII анализируют только надежно.

Кроме того, многие скрипты с автоматическим анализом ссылок душат не-ASCII-символы. Таким образом, использование URL-адресов с не-ASCII-символами в ваших URL-адресах значительно сокращает изменение вашей ссылки, отображаемой (правильно) в пользовательском контенте. (если вам нужен пример такого скрипта, взгляните на скрипт stackoverflow, он, например, заглушает скобки)

Вы также можете взглянуть на: Как обращаться с диакритическими знаками (акцентами) при переписывании "красивых URL"

Принято решение о транзитерации не-ASCII символов:

<?php
  $text = iconv('UTF-8', 'US-ASCII//TRANSLIT', $text);
?>

Надеюсь, это поможет

4 голосов
/ 12 апреля 2009

Если выбран режим UTF-8, вы можете выбрать все не- Буква с (в соответствии с общей категорией Unicode - см. Документацию PHP Подробности регулярного выражения ) с помощью

/\P{L}+/

поэтому я бы попробовал следующее (не проверено):

function convertToPath($string)
{
    $string = mb_strtolower(trim($string), 'UTF-8');
    $string = preg_replace('/\P{L}+/', '-', $string);
    $string = preg_replace('/-+/', "-", $string);
    return $string;
}

Имейте в виду, что вы получите проблемы с strtolower() в строках UTF-8, так как он будет связываться с многобайтовыми символами - используйте mb_strtolower().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...