WP_SPRINTF() │ WordPress 2.5.0: Функция для форматирования строк с использованием фильтров

WP_SPRINTF() │ WP 2.5.0

Функция WordPress для форматирования строк на основе PHP функции sprintf() с возможностью использования фильтров.

Быстрая информация

  • Время выполнения один раз: 0.000104 сек (быстро)
  • Время выполнения 50000 раз: 0.30 сек (очень быстро)
  • PHP версия: 7.1.11
  • WordPress версия: 4.9.7

Хуки функции

  • wp_sprintf

Возвращаемое значение

Функция возвращает отформатированную строку.

Использование

wp_sprintf( $pattern, ...$args );

Параметры

  • $pattern (string) (обязательный) — строка, в которую будут подставляться отформатированные аргументы.
  • ...$args (mixed) (обязательный) — аргументы, которые будут отформатированы в строку $pattern.

Примеры

Пример 1: Замена строк

echo wp_sprintf( '%s: %l', 'Prefix', [ 'one', 'two', 'three', 'four' ] );
// Вывод: Prefix: one, two, three and four

Пример 2: Дополнительные примеры форматирований

$pattern = '%d monkeys are sitting on the %s';
echo wp_sprintf( $pattern, 5, 'tree' ); 
// Выв��д: 5 monkeys are sitting on the tree

$pattern = 'There are %1$d monkeys sitting on the %2$s';
echo wp_sprintf( $pattern, 5, 'tree' ); 
// Вывод: There are 5 monkeys on the tree

$pattern = 'There are %1$d monkeys sitting on the %2$s. %1$d monkeys are sitting on the %2$s';
echo wp_sprintf( $pattern, 5, 'tree' ); 
// Вывод: There are 5 monkeys on the tree. There are 5 monkeys on the tree.

Изменения

  • С версии 2.5.0 — Функция была введена.
  • С версии 5.3.0 — Параметр ...$args был формализован и добавлен в сигнатуру функции.

Код функции

Функция wp_sprintf реализует логику форматирования строки:


function wp_sprintf( $pattern, ...$args ) {
$len = strlen( $pattern );
$start = 0;
$result = '';
$arg_index = 0;

while ( $len > $start ) {
    // Если последний символ: добавляем и выходим.
    if ( strlen( $pattern ) - 1 === $start ) {
        $result .= substr( $pattern, -1 );
        break;
    }

    // Литерал %: добавляем и продолжаем.
    if ( '%%' === substr( $pattern, $start, 2 ) ) {
        $start  += 2;
        $result .= '%';
        continue;
    }

    // Получаем фрагмент перед следующим %.
    $end = strpos( $pattern, '%', $start + 1 );
    if ( false === $end ) {
        $end = $len;
    }
    $fragment = substr( $pattern, $start, $end - $start );

    // Если фрагмент имеет спецификатор.
    if ( '%' === $pattern[ $start ] ) {
        // Находим номер аргумента или берем следующий по порядку.
        if ( preg_match( '/^%(d+)$/', $fragment, $matches ) ) {
            $index    = $matches[1] - 1; // Индекс массива с нуля, а аргументы sprintf() — с единицы.
            $arg      = isset( $args[ $index ] ) ? $args[ $index ] : '';
            $fragment = str_replace( "%{$matches[1]}$", '%', $fragment );
        } else {
            $arg = isset( $args[ $arg_index ] ) ? $args[ $arg_index ] : '';
            ++$arg_index;
        }

        /**
         * Фильтрует фрагмент из шаблона, переданного в wp_sprintf().
         *
         * Если фрагмент не изменен, то будет выполнена функция sprintf() для фрагмента.
         *
         * @since 2.5.0
         *
         * @param string $fragment фрагмент из шаблона.
         * @param string $arg      аргумент.
         */
        $_fragment = apply_filters( 'wp_sprintf', $fragment, $arg );

        if ( $_fragment !== $fragment ) {
            $fragment = $_fragment;
        } else {
            $fragment = sprintf( $fragment, (string) $arg );
        }
    }

    // Добавляем к результату и переходим к следующему фрагменту.
    $result .= $fragment;
    $start   = $end;
}

return $result;

}

Связанные функции

WordPress содержит множество связанных функций, которые могут быть полезны при работе с массивами и строками. Некоторые из них:

  • array_is_list()
  • array_key_first()
  • is_countable()
  • str_contains()
  • wp_basename()
  • wp_generate_uuid4()

Эти функции облегчают работу с данными и помогают улучшить код с точки зрения удобс��ва и эффективности.

Используйте wp_sprintf для адаптации строк в вашем коде WordPress, что сделает ваши сообщения и выводы более гибкими и понятными для пользователей.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *