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

Как я могу выбрать и загрузить несколько файлов с помощью HTML и PHP, используя HTTP POST?

Плагины Chrome - недооцененная ниша бизнеса
Web

Плагины Chrome - недооцененная ниша бизнеса

Сравнение VPN-сервисов: выбираем лучший по нескольким критериям
Web

Сравнение VPN-сервисов: выбираем лучший по нескольким критериям

Web

Применение выражения eval в php

×