замена переменной preg_replace, показывающая ошибку в одинарных кавычках

у меня есть это 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) как показано во втором примере?

Обновление № 1

Эта проблема происходит не только из-за функции 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 '$'

1

Решение

Вы не можете использовать функцию во втором параметре preg_replace,
'<strong>' . ucfirst($1) . '</strong>' оценивается перед поиском. Чтобы использовать функцию в замене регулярного выражения, вы должны использовать preg_replace_callback:

$result = preg_replace_callback($pattern, function ($m) {
return '<strong>' . ucfirst($m[1]) . '</strong>';
}, $yourstring);
2

Другие решения

Вы получаете эту ошибку не из-за типа кавычек, а потому что вы делаете это вне кавычек.

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

демонстрация

Эта статья не говорю об этом, но в любом случае это отличное чтение.

1

По вопросам рекламы [email protected]