Чувствительны ли короткие коды к регистру символов?
Если я напишу плагин и зарегистрирую шорткод, используя этот код:
add_shortcode('footag', 'footag_func');
И пользователь использует это в своем сообщении:
[FOOTAG]
Предполагается, что это сработает?
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
(означает, что .
соответствует всем символам, включая новую строку).
Итак, да, короткие коды чувствительны к регистру.