Чувствительны ли короткие коды к регистру символов?


Если я напишу плагин и зарегистрирую шорткод, используя этот код:

add_shortcode('footag', 'footag_func');

И пользователь использует это в своем сообщении:

[FOOTAG]

Предполагается, что это сработает?

Author: Ben Miller - Remember Monica, 2013-06-09

1 answers

Краткий ответ

Да, короткие коды чувствительны к регистру

Более длинный ответ

Для этого действительно легко построить тестовый случай и посмотреть.

<?php
add_shortcode('sOme_ShOrTcOdE', 'wpse102375_shortcode');
function wpse102375_shortcode($args, $content=null)
{
    return 'yep';
}

Самый длинный ответ

Прочитайте источник.

"Волшебство" с короткими кодами происходит в do_shortcode, так что давайте взглянем на это.

<?php
// wp-includes/shortcode.php
function do_shortcode($content) {
    global $shortcode_tags;

    if (empty($shortcode_tags) || !is_array($shortcode_tags))
        return $content;

    $pattern = get_shortcode_regex();
    return preg_replace_callback( "/$pattern/s", 'do_shortcode_tag', $content );
}

Хммм, $shortcode_tags - вероятно, он настроен в add_shortcode:

<?php
// wp-includes/shortcodes.php
function add_shortcode($tag, $func) {
    global $shortcode_tags;

    if ( is_callable($func) )
        $shortcode_tags[$tag] = $func;
}

Так что это всего лишь ключевая часть значения $shortcode_name => $a_callablle. Делает смысл.

Похоже, что большая часть магии do_shortcode заключается в построении регулярного выражения, соответствующего самим коротким кодам. Все, что происходит в get_shortcode_regex, так что давайте взглянем туда:

<?php
// wp-includes/shortcode.php
function get_shortcode_regex() {
    global $shortcode_tags;
    $tagnames = array_keys($shortcode_tags);
    $tagregexp = join( '|', array_map('preg_quote', $tagnames) );

    // WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcode_tag()
    // Also, see shortcode_unautop() and shortcode.js.
    return
          '\\['                              // Opening bracket
        . '(\\[?)'                           // 1: Optional second opening bracket for escaping shortcodes: [[tag]]
        . "($tagregexp)"                     // 2: Shortcode name
        . '(?![\\w-])'                       // Not followed by word character or hyphen
        . '('                                // 3: Unroll the loop: Inside the opening shortcode tag
        .     '[^\\]\\/]*'                   // Not a closing bracket or forward slash
        .     '(?:'
        .         '\\/(?!\\])'               // A forward slash not followed by a closing bracket
        .         '[^\\]\\/]*'               // Not a closing bracket or forward slash
        .     ')*?'
        . ')'
        . '(?:'
        .     '(\\/)'                        // 4: Self closing tag ...
        .     '\\]'                          // ... and closing bracket
        . '|'
        .     '\\]'                          // Closing bracket
        .     '(?:'
        .         '('                        // 5: Unroll the loop: Optionally, anything between the opening and closing shortcode tags
        .             '[^\\[]*+'             // Not an opening bracket
        .             '(?:'
        .                 '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag
        .                 '[^\\[]*+'         // Not an opening bracket
        .             ')*+'
        .         ')'
        .         '\\[\\/\\2\\]'             // Closing shortcode tag
        .     ')?'
        . ')'
        . '(\\]?)';                          // 6: Optional second closing brocket for escaping shortcodes: [[tag]]
}

Очень хорошо прокомментировано в ядре, поэтому здесь не так много нужно объяснять. Ключевая часть здесь:

global $shortcode_tags;
$tagnames = array_keys($shortcode_tags);
$tagregexp = join( '|', array_map('preg_quote', $tagnames) );

, Который, по сути, будет использоваться позже, чтобы явно соответствовать любому из зарегистрированных имен шорткодов. Обратите внимание, что обработка текста не выполняется, кроме preg_quote, поэтому WP будет пытаться только сопоставьте явные значения, переданные в add_shortcode в качестве имени шорткода. Похоже, что короткие коды пока чувствительны к регистру .

Далее нам нужно взглянуть на флаги, в которых используется регулярное выражение, встроенное в get_shortcode_regex. Соответствующий бит do_shortcode.

"/$pattern/s"

Косые черты разделяют регулярное выражение, буквы после закрывающей косой черты являются Флагами или модификаторами PRCE.

Если бы мы увидели там i, это было бы нечувствительно к регистру. У нас есть только s (означает, что . соответствует всем символам, включая новую строку).

Итак, да, короткие коды чувствительны к регистру.

 9
Author: chrisguitarguy, 2013-06-09 03:35:10