у меня есть это preg_replace
заявление,
$s = "Foo money bar";
echo preg_replace("/(office|rank|money)/i", "<strong>$1</strong>", $s);
Который возвращается,
Foo <strong>money</strong> bar
Однако, когда я пытаюсь сделать то же самое с одинарными кавычками и с функцией, используемой на $i
это ломает,
$s = "Foo money bar";
echo preg_replace("/(office|rank|money)/i", '<strong>' . ucfirst($1) . '</strong>', $s);
Обратите внимание на одинарные кавычки во втором параметре функции, теперь это дает,
syntax error, unexpected '1' (T_LNUMBER), expecting variable (T_VARIABLE) or '{' or '$'
Живой пример
Итак, мой вопрос: почему это происходит и как я могу получить ожидаемый результат (сильный с ucfirst
) как показано во втором примере?
Эта проблема происходит не только из-за функции ucfirst
но из-за одинарных кавычек тоже, что можно увидеть в этот пример,
$s = "Foo money bar";
echo preg_replace("/(office|rank|money)/i", '<strong>' . $1 . '</strong>', $s);
Выход
syntax error, unexpected '1' (T_LNUMBER), expecting variable (T_VARIABLE) or '{' or '$'
Вы не можете использовать функцию во втором параметре preg_replace
,
'<strong>' . ucfirst($1) . '</strong>'
оценивается перед поиском. Чтобы использовать функцию в замене регулярного выражения, вы должны использовать preg_replace_callback:
$result = preg_replace_callback($pattern, function ($m) {
return '<strong>' . ucfirst($m[1]) . '</strong>';
}, $yourstring);
Вы получаете эту ошибку не из-за типа кавычек, а потому что вы делаете это вне кавычек.
echo preg_replace("/(office|rank|money)/i", "<strong>" . $1 . "</strong>", $s);
Это выдает ту же ошибку. Это потому что $1
не является переменной, это обратная ссылка. Вы можете сослаться на это как \1
вместо $1
и будет понятнее
Таким образом, вы не можете ссылаться на обратную ссылку вне кавычек (кроме того, $1
будет недопустимым именем переменной). Я не могу обратиться к конкретным внутренним сведениям о том, как это работает (ничего не смог найти), но, вероятно, он установлен как «флаг» для интерпретатора, который нужно заменить на n-ю подходящую группу.
Интересно, если вы используете функцию в качестве второго параметра а также оберните обратную ссылку в кавычки, это все еще работает! (В том смысле, что он не выдаст ошибку. Он по-прежнему не будет запускать функцию.)
<?php
$s = "Foo money bar";
echo preg_replace("/(office|rank|money)/i", '<strong>' . ucfirst('$1') . '</strong>', $s); // works with single and double quotes
Эта статья не говорю об этом, но в любом случае это отличное чтение.