Web

Функция PHP для создания slug

Я хочу создать функцию для формирования slug из строк Unicode, например, gen_slug('Andrés Cortez') должна возвращать andres-cortez. Как мне это сделать?

 

Ответ 1

Вместо постоянной замены попробуйте сделать это:

public static function slugify($text, string $divider = '-') {

  // заменить небукву или цифру на делитель

  $text = preg_replace('~[^\pL\d]+~u', $divider, $text);

  // транслитерация

  $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);

  // удалить ненужные символы

  $text = preg_replace('~[^-\w]+~', '', $text);

  // обрезка

  $text = trim($text, $divider);

  //удаление дубликатов

  $text = preg_replace('~-+~', $divider, $text);

  // нижний регистр

  $text = strtolower($text);

  if (empty($text)) {

    return 'n-a';

  }

  return $text;

}

 

За основу был взят вариант из учебника Symfony по Jobeet.

 

Ответ 2

Примечание: Я взял код из wordpress, и это работает!!! Используйте его следующим образом:

echo sanitize('Ссылка для теста');

 Код:

//взято из wordpress

function utf8_uri_encode( $utf8_string, $length = 0 ) {

    $unicode = '';

    $values = array();

    $num_octets = 1;

    $unicode_length = 0;

 

    $string_length = strlen( $utf8_string );

    for ($i = 0; $i < $string_length; $i++ ) {

        $value = ord( $utf8_string[ $i ] );

        if ( $value < 128 ) {

            if ( $length && ( $unicode_length >= $length ) )

                break;

            $unicode .= chr($value);

            $unicode_length++;

        } else {

            if ( count( $values ) == 0 ) $num_octets = ( $value < 224 ) ? 2 : 3;

            $values[] = $value;

            if ( $length && ( $unicode_length + ($num_octets * 3) ) > $length )

                break;

            if ( count( $values ) == $num_octets ) {

                if ($num_octets == 3) {

                    $unicode .= '%' . dechex($values[0]) . '%' . dechex($values[1]) . '%' . dechex($values[2]);

                    $unicode_length += 9;

                } else {

                    $unicode .= '%' . dechex($values[0]) . '%' . dechex($values[1]);

                    $unicode_length += 6;

                }

                $values = array();

                $num_octets = 1;

            }

        }

    }

    return $unicode;

}

//взято из wordpress

function seems_utf8($str) {

    $length = strlen($str);

    for ($i=0; $i < $length; $i++) {

        $c = ord($str[$i]);

        if ($c < 0x80) $n = 0; # 0bbbbbbb

        elseif (($c & 0xE0) == 0xC0) $n=1; # 110bbbbb

        elseif (($c & 0xF0) == 0xE0) $n=2; # 1110bbbb

        elseif (($c & 0xF8) == 0xF0) $n=3; # 11110bbb

        elseif (($c & 0xFC) == 0xF8) $n=4; # 111110bb

        elseif (($c & 0xFE) == 0xFC) $n=5; # 1111110b

        else return false; # Does not match any model

        for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?

            if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80))

                return false;

        }

    }

    return true;

}

//функция sanitize_title_with_dashes взята из wordpress

function sanitize($title) {

    $title = strip_tags($title);

    // Сохраняем экранированные октеты.

    $title = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title);

    // Удалите знаки процентов, которые не являются частью октета.

    $title = str_replace('%', '', $title);

    // Восстановить октеты.

    $title = preg_replace('|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $title);

    if (seems_utf8($title)) {

        if (function_exists('mb_strtolower')) {

            $title = mb_strtolower($title, 'UTF-8');

        }

        $title = utf8_uri_encode($title, 200);

    }

 

    $title = strtolower($title);

    $title = preg_replace('/&.+?;/', '', $title); // уничтожить сущности

    $title = str_replace('.', '-', $title);

    $title = preg_replace('/[^%a-z0-9 _-]/', '', $title);

    $title = preg_replace('/\s+/', '-', $title);

    $title = preg_replace('|-+|', '-', $title);

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

    return $title;

}

 

 Ответ 3

Вот еще один вариант, например, «Заголовок со «странными» символами ééé A X Z» становится «title-with-strange-characters-eee-a-x-z».

/**

* Функция, используемая для создания slug, связанного с "некрасивой" строкой.

 *

 * @param string $string строка для преобразования.

 *

 * @return string результирующий slug.

 */

public static function createSlug($string) {

    $table = array(

            'Š'=>'S', 'š'=>'s', 'Đ'=>'Dj', 'đ'=>'dj', 'Ž'=>'Z', 'ž'=>'z', 'Č'=>'C', 'č'=>'c', 'Ć'=>'C', 'ć'=>'c',

            'À'=>'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', 'Ŕ'=>'R', 'ŕ'=>'r', '/' => '-', ' ' => '-'

    );

    // -- Удалите дублирующиеся пробелы

    $stripped = preg_replace(array('/\s{2,}/', '/[\t\n]/'), ' ', $string);

    // -- Возвращает slug

    return strtolower(strtr($string, $table));

}

 

Ответ 4

<?php

//  Добавьте методы для slugify, взятые из Wordpress:

// - https://github.com/WordPress/WordPress/blob/master/wp-includes/formatting.php 

// - https://github.com/WordPress/WordPress/blob/master/wp-includes/functions.php

/**

 * Устанавливает внутреннюю кодировку mbstring в безопасную двоичную кодировку, когда func_overload

 * включена.

 *

 * Когда mbstring.func_overload используется для многобайтовых кодировок, результаты от mbstring.

 * strlen() и подобных функций не учитывают символы utf8, что приводит к тому, что двоичные данные

 * возвращают неправильную длину.

 *

 * Эта функция переопределяет кодировку mbstring на кодировку, безопасную для двоичных данных, и

 * сбрасывает ее на ожидаемую пользователями кодировку после этого с помощью 

 * `reset_mbstring_encoding` функции.

 *

 * Безопасно рекурсивно вызывать эту функцию, однако каждая функция,

 * вызывающая `mbstring_binary_safe_encoding()`, должна сопровождаться равным количеством вызовов

 * `reset_mbstring_encoding()`.

 *

 * @since 3.7.0

 *

 * @see reset_mbstring_encoding()

 *

 * @param bool $reset Необязательно. Нужно ли вернуть кодировку к ранее установленной кодировке.

 * По умолчанию false.

 */

function mbstring_binary_safe_encoding( $reset = false ) {

  static $encodings = array();

  static $overloaded = null;

  if ( is_null( $overloaded ) )

    $overloaded = function_exists( 'mb_internal_encoding' ) && ( ini_get( 'mbstring.func_overload' ) & 2 );

  if ( false === $overloaded )

    return;

  if ( ! $reset ) {

    $encoding = mb_internal_encoding();

    array_push( $encodings, $encoding );

    mb_internal_encoding( 'ISO-8859-1' );

  }

  if ( $reset && $encodings ) {

    $encoding = array_pop( $encodings );

    mb_internal_encoding( $encoding );

  }

}

 

/**

 * Сброс внутренней кодировки mbstring на ранее установленную пользователем кодировку.

 *

 * @see mbstring_binary_safe_encoding()

 *

 * @since 3.7.0

 */

function reset_mbstring_encoding() {

  mbstring_binary_safe_encoding( true );

}

 

 

/**

 * Проверяет, закодирована ли строка в формате utf8.

 *

 * ПРИМЕЧАНИЕ: Эта функция проверяет 5-байтовые последовательности, UTF8

 * имеет байтовые последовательности с максимальной длиной 4.

 *

 * @author bmorel at ssi dot fr (изменено)

 * @since 1.2.1

 *

 * @param string $str Проверяемая строка.

 * @return bool True, если $str соответствует модели UTF-8, false в противном случае.

 */

function seems_utf8($str) {

  mbstring_binary_safe_encoding();

  $length = strlen($str);

  reset_mbstring_encoding();

  for ($i=0; $i < $length; $i++) {

    $c = ord($str[$i]);

    if ($c < 0x80) $n = 0; # 0bbbbbbb

    elseif (($c & 0xE0) == 0xC0) $n=1; # 110bbbbb

    elseif (($c & 0xF0) == 0xE0) $n=2; # 1110bbbb

    elseif (($c & 0xF8) == 0xF0) $n=3; # 11110bbb

    elseif (($c & 0xFC) == 0xF8) $n=4; # 111110bb

    elseif (($c & 0xFE) == 0xFC) $n=5; # 1111110b

    else return false; # Does not match any model

    for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?

      if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80))

        return false;

    }

  }

  return true;

}

 

 

/**

 * Кодируйте значения Unicode, которые будут использоваться в URI.

 *

 * @since 1.5.0

 *

 * @param string $utf8_string

 * @param int $length Максимальная длина строки

 * @return string Строка с кодировкой Unicode для URI.

 */

function utf8_uri_encode( $utf8_string, $length = 0 ) {

  $unicode = '';

  $values = array();

  $num_octets = 1;

  $unicode_length = 0;

  mbstring_binary_safe_encoding();

  $string_length = strlen( $utf8_string );

  reset_mbstring_encoding();

  for ($i = 0; $i < $string_length; $i++ ) {

    $value = ord( $utf8_string[ $i ] );

    if ( $value < 128 ) {

      if ( $length && ( $unicode_length >= $length ) )

        break;

      $unicode .= chr($value);

      $unicode_length++;

    } else {

      if ( count( $values ) == 0 ) $num_octets = ( $value < 224 ) ? 2 : 3;

      $values[] = $value;

      if ( $length && ( $unicode_length + ($num_octets * 3) ) > $length )

        break;

      if ( count( $values ) == $num_octets ) {

        if ($num_octets == 3) {

          $unicode .= '%' . dechex($values[0]) . '%' . dechex($values[1]) . '%' . dechex($values[2]);

          $unicode_length += 9;

        } else {

          $unicode .= '%' . dechex($values[0]) . '%' . dechex($values[1]);

          $unicode_length += 6;

        }

        $values = array();

        $num_octets = 1;

      }

    }

  }

 

  return $unicode;

}

 

 

/**

 * Санирует заголовок, заменяя пробелы и некоторые другие символы на тире.

 *

 * Ограничивает вывод буквенно-цифровыми символами, подчеркиванием (_) и тире (-).

 * Пробел становится тире.

 *

 * @since 1.2.0

 *

 * @param string $title Заголовок, который нужно санировать.

 * @param string $raw_title Необязательно. Не используется.

 * @param string $context Необязательно. Операция, для которой проверяется строка.

 * @return string Скорректированный заголовок.

 */

function sanitize_title_with_dashes( $title, $raw_title = '', $context = 'display' ) {

  $title = strip_tags($title);

  // Сохраняем экранированные октеты.

  $title = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title);

  // Удалите знаки процентов, которые не являются частью октета.

  $title = str_replace('%', '', $title);

  // Восстановить октеты.

  $title = preg_replace('|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $title);

  if (seems_utf8($title)) {

    if (function_exists('mb_strtolower')) {

      $title = mb_strtolower($title, 'UTF-8');

    }

    $title = utf8_uri_encode($title, 200);

  }

  $title = strtolower($title);

  $title = preg_replace('/&.+?;/', '', $title); // kill entities

  $title = str_replace('.', '-', $title);

  if ( 'save' == $context ) {

    // Преобразование nbsp, ndash и mdash в дефисы

    $title = str_replace( array( '%c2%a0', '%e2%80%93', '%e2%80%94' ), '-', $title );

    // Полностью удалите эти символы

    $title = str_replace( array(

      // iexcl и iquest

      '%c2%a1', '%c2%bf',

      // угловые кавычки

      '%c2%ab', '%c2%bb', '%e2%80%b9', '%e2%80%ba',

      // фигурные кавычки

      '%e2%80%98', '%e2%80%99', '%e2%80%9c', '%e2%80%9d',

      '%e2%80%9a', '%e2%80%9b', '%e2%80%9e', '%e2%80%9f',

      // copy, reg, deg, hellip and trade

      '%c2%a9', '%c2%ae', '%c2%b0', '%e2%80%a6', '%e2%84%a2',

      // острые ударения

      '%c2%b4', '%cb%8a', '%cc%81', '%cd%81',

      // grave accent, macron, caron

      '%cc%80', '%cc%84', '%cc%8c',

    ), '', $title );

    // Преобразование времени в x

    $title = str_replace( '%c3%97', 'x', $title );

  }

  $title = preg_replace('/[^%a-z0-9 _-]/', '', $title);

  $title = preg_replace('/\s+/', '-', $title);

  $title = preg_replace('|-+|', '-', $title);

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

  return $title;

}

 

$title = '#PFW Alexander McQueen Spring/Summer 2019';

echo "title -> slug: \n". $title ." -> ". sanitize_title_with_dashes($title);

echo "\n\n";

$title = '«GQ»: Elyas M\'Barek gehört zu Männern des Jahres';

echo "title -> slug: \n". $title ." -> ". sanitize_title_with_dashes($title);

 

Ответ 5

Я не знал, какой из вариантов использовать, поэтому я сделал быстрый тест на phptester.net:

<?php

// Первый тест

function slugify(STRING $string, STRING $separator = '-'){

    $accents_regex = '~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i';

    $special_cases = [ '&' => 'and', "'" => ''];

    $string = mb_strtolower( trim( $string ), 'UTF-8' );

    $string = str_replace( array_keys($special_cases), array_values( $special_cases), $string );

    $string = preg_replace( $accents_regex, '$1', htmlentities( $string, ENT_QUOTES, 'UTF-8' ) );

    $string = preg_replace('/[^a-z0-9]/u', $separator, $string);

    return preg_replace('/['.$separator.']+/u', $separator, $string);

}

 

// Второй тест

function slug(STRING $string, STRING $separator = '-'){

    $string = transliterator_transliterate('Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove; Lower();', $string);

    return str_replace(' ', $separator, $string);;

}

 

// Третий тест – мой выбор

function slugbis($text){

    $replace = [

        '<' => '', '>' => '', '-' => ' ', '&' => '',

        '"' => '', 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä'=> 'Ae',

        'Ä' => 'A', 'Å' => 'A', 'Ā' => 'A', 'Ą' => 'A', 'Ă' => 'A', 'Æ' => 'Ae',

        'Ç' => 'C', 'Ć' => 'C', 'Č' => 'C', 'Ĉ' => 'C', 'Ċ' => 'C', 'Ď' => 'D', 'Đ' => 'D',

        'Ð' => 'D', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ē' => 'E',

        'Ę' => 'E', 'Ě' => 'E', 'Ĕ' => 'E', 'Ė' => 'E', 'Ĝ' => 'G', 'Ğ' => 'G',

        'Ġ' => 'G', 'Ģ' => 'G', 'Ĥ' => 'H', 'Ħ' => 'H', 'Ì' => 'I', 'Í' => 'I',

        'Î' => 'I', 'Ï' => 'I', 'Ī' => 'I', 'Ĩ' => 'I', 'Ĭ' => 'I', 'Į' => 'I',

        'İ' => 'I', 'IJ' => 'IJ', 'Ĵ' => 'J', 'Ķ' => 'K', 'Ł' => 'K', 'Ľ' => 'K',

        'Ĺ' => 'K', 'Ļ' => 'K', 'Ŀ' => 'K', 'Ñ' => 'N', 'Ń' => 'N', 'Ň' => 'N',

        'Ņ' => 'N', 'Ŋ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O',

        'Ö' => 'Oe', 'Ö' => 'Oe', 'Ø' => 'O', 'Ō' => 'O', 'Ő' => 'O', 'Ŏ' => 'O',

        'Œ' => 'OE', 'Ŕ' => 'R', 'Ř' => 'R', 'Ŗ' => 'R', 'Ś' => 'S', 'Š' => 'S',

        'Ş' => 'S', 'Ŝ' => 'S', 'Ș' => 'S', 'Ť' => 'T', 'Ţ' => 'T', 'Ŧ' => 'T',

        'Ț' => 'T', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'Ue', 'Ū' => 'U',

        'Ü' => 'Ue', 'Ů' => 'U', 'Ű' => 'U', 'Ŭ' => 'U', 'Ũ' => 'U', 'Ų' => 'U',

        'Ŵ' => 'W', 'Ý' => 'Y', 'Ŷ' => 'Y', 'Ÿ' => 'Y', 'Ź' => 'Z', 'Ž' => 'Z',

        'Ż' => 'Z', 'Þ' => 'T', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a',

        'ä' => 'ae', 'ä' => 'ae', 'å' => 'a', 'ā' => 'a', 'ą' => 'a', 'ă' => 'a',

        'æ' => 'ae', 'ç' => 'c', 'ć' => 'c', 'č' => 'c', 'ĉ' => 'c', 'ċ' => 'c',

        'ď' => 'd', 'đ' => 'd', 'ð' => 'd', 'è' => 'e', 'é' => 'e', 'ê' => 'e',

        'ë' => 'e', 'ē' => 'e', 'ę' => 'e', 'ě' => 'e', 'ĕ' => 'e', 'ė' => 'e',

        'ƒ' => 'f', 'ĝ' => 'g', 'ğ' => 'g', 'ġ' => 'g', 'ģ' => 'g', 'ĥ' => 'h',

        'ħ' => 'h', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ī' => 'i',

        'ĩ' => 'i', 'ĭ' => 'i', 'į' => 'i', 'ı' => 'i', 'ij' => 'ij', 'ĵ' => 'j',

        'ķ' => 'k', 'ĸ' => 'k', 'ł' => 'l', 'ľ' => 'l', 'ĺ' => 'l', 'ļ' => 'l',

        'ŀ' => 'l', 'ñ' => 'n', 'ń' => 'n', 'ň' => 'n', 'ņ' => 'n', 'ʼn' => 'n',

        'ŋ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'oe',

        'ö' => 'oe', 'ø' => 'o', 'ō' => 'o', 'ő' => 'o', 'ŏ' => 'o', 'œ' => 'oe',

        'ŕ' => 'r', 'ř' => 'r', 'ŗ' => 'r', 'š' => 's', 'ù' => 'u', 'ú' => 'u',

        'û' => 'u', 'ü' => 'ue', 'ū' => 'u', 'ü' => 'ue', 'ů' => 'u', 'ű' => 'u',

        'ŭ' => 'u', 'ũ' => 'u', 'ų' => 'u', 'ŵ' => 'w', 'ý' => 'y', 'ÿ' => 'y',

        'ŷ' => 'y', 'ž' => 'z', 'ż' => 'z', 'ź' => 'z', 'þ' => 't', 'ß' => 'ss',

        'ſ' => 'ss', 'ый' => 'iy', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G',

        'Д' => 'D', 'Е' => 'E', 'Ё' => 'YO', 'Ж' => 'ZH', 'З' => 'Z', 'И' => 'I',

        'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O',

        'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F',

        'Х' => 'H', 'Ц' => 'C', 'Ч' => 'CH', 'Ш' => 'SH', 'Щ' => 'SCH', 'Ъ' => '',

        'Ы' => 'Y', 'Ь' => '', 'Э' => 'E', 'Ю' => 'YU', 'Я' => 'YA', 'а' => 'a',

        'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo',

        'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l',

        'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's',

        'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch',

        'ш' => 'sh', 'щ' => 'sch', 'ъ' => '', 'ы' => 'y', 'ь' => '', 'э' => 'e',

        'ю' => 'yu', 'я' => 'ya'

    ];

    // сделать человекочитаемую строку

    $text = strtr($text, $replace);

    // заменить небуквенные или цифровые символы на «–«

    $text = preg_replace('~[^\pL\d.]+~u', '-', $text);

    // обрезка

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

    // удаляем ненужные символы

    $text = preg_replace('~[^-\w.]+~', '', $text);

    return strtolower($text);

}

 

// Четвертый тест

function slugagain($string){

    $table = [

        'Š'=>'S', 'š'=>'s', 'Đ'=>'Dj', 'đ'=>'dj', 'Ž'=>'Z', 'ž'=>'z', 'Č'=>'C', 'č'=>'c', 'Ć'=>'C', 'ć'=>'c',

        'À'=>'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', 'Ŕ'=>'R', 'ŕ'=>'r', ' '=>'-'

    ];

    return strtr($string, $table);

}

 

// Пятый тест

function slugifybis($url){

    $url = trim($url);

    $url = str_replace(' ', '-', $url);

    $url = str_replace('/', '-slash-', $url);

    return rawurlencode($url);

}

 

// Шестой и последний тест

setlocale( LC_ALL, "en_US.UTF8" );  

function slugifyagain($string){

    $string = iconv('utf-8', 'us-ascii//translit//ignore', $string); // transliterate

    $string = str_replace("'", '', $string);

    $string = preg_replace('~[^\pL\d]+~u', '-', $string); // заменить небукву или нецифру на "-"

    $string = preg_replace('~[^-\w]+~', '', $string); // удаляем ненужные символы

    $string = preg_replace('~-+~', '-', $string); // удалите дубликат "-"

    $string = trim($string, '-'); // обрезка по "-"

    $string = trim($string); // обрезка

    $string = mb_strtolower($string, 'utf-8'); // нижний регистр

        return urlencode($string); // safe;

};

$string = $newString = "¿ Àñdréß l'affreux ğarçon & nøël en forêt !";

$max = 10000;

echo '<pre>';

echo 'Beginning :';

echo '<br />';

echo '<br />';    

echo '> Выполнение '.$max.' итераций :';

echo '<br />';

echo '>> ' . $string;

echo '<br />';  

echo '<br />';

echo 'Output results :';

echo '<br />';

echo '<br />';  

$start = microtime(true);

for($i = 0 ; $i < $max ; $i++){

    $newString = slugify($string);

}

$time = (microtime(true) - $start) * 1000;

echo '> Первый тест пройден за**' . round($time, 2) . мс**';

echo '<br />';  

echo '>> Результат : ' . $newString;

echo '<br />';

echo '<br />';

$start = microtime(true);

for($i = 0 ; $i < $max ; $i++){

    $newString = slug($string);

}

$time = (microtime(true) - $start) * 1000;

echo '> Второй тест пройден за **' . round($time, 2) . мс**';

echo '<br />';

echo '>> Результат : ' . $newString;

echo '<br />';

echo '<br />';

$start = microtime(true);

for($i = 0 ; $i < $max ; $i++){

    $newString = slugbis($string);

}

$time = (microtime(true) - $start) * 1000;

echo '> Третий тест пройден за **' . round($time, 2) . мс**';

echo '<br />';

echo '>> Результат : ' . $newString;

echo '<br />';

echo '<br />';

$start = microtime(true);

for($i = 0 ; $i < $max ; $i++){

    $newString = slugagain($string);

}

$time = (microtime(true) - $start) * 1000;

echo '> Четвертый тест пройден за **' . round($time, 2) . мс**';

echo '<br />';

echo '>> Результат : ' . $newString;

echo '<br />';

echo '<br />';

$start = microtime(true);

for($i = 0 ; $i < $max ; $i++){

    $newString = slugifybis($string);

}

$time = (microtime(true) - $start) * 1000;

echo '> Пятый тест пройден за **' . round($time, 2) . мс**';

echo '<br />';

echo '>> Результат : ' . $newString;

echo '<br />';

echo '<br />';

$start = microtime(true);

for($i = 0 ; $i < $max ; $i++){

    $newString = slugifyagain($string);

}

$time = (microtime(true) - $start) * 1000;

echo '> Шестой тест пройден за **' . round($time, 2) . мс**';

echo '<br />';

echo '>> Результат : ' . $newString;

echo '</pre>';

 

Запуск тестирования. Выполнение 10000 итераций:

¿ Àñdréß l'affreux ğarçon & nøël en forêt!

Результаты вывода:

Первый тест пройден за 120,78 мс

Результат: -iquest-andresz-laffreux-arcon-and-noël-en-foret-

Второй тест пройден за 3883,82 мс

Результат: -andreß-laffreux-garcon--nøel-en-foret-

Третий тест пройден за 56,83 мс

Результат: андресс-л-аффрё-гаркон-ноэль-ан-форет

Четвертый тест пройден за 18,93 мс

Результат: ¿-Андресс-л'аффрё-гаркон-&-ноэль-ен-форет-!

Пятый тест пройден за 6,45 мс

Результат: %C2%BF-%C3%80%C3%B1dr%C3%A9%C3%9F-l%27affreux-%C4%9Far%C3%A7on-%26-n%C3%B8%C3%ABl-en-for%C3%AAt-%21

Шестой тест пройден за 112,42 мс

Результат: andress-laffreux-garcon-n-el-en-foret

 

Схожие статьи

Web

Использование password_hash для хеширования и проверки паролей в PHP

Какой выбрать CDN для сайта. Оптимизируем скорость загрузки
Web

Какой выбрать CDN для сайта. Оптимизируем скорость загрузки

Web

Как получить значения функции при вводе значения из PHP формы?

Web

Как сохранить изображение PNG на стороне сервера из URI данных base64