PHP preg_replace неожиданный вывод в случае совпадения специального символа '$'

0

Я получил проблему в скрипте PHP, в случае этой функции для регулярного выражения и замены. Я тестировал свое регулярное выражение на www.regex101.com и получал всегда ожидаемые результаты, но не в PHP.

Я использую этот шаблон внутри функции:

$matchedName = preg_replace("/^(\$|\(.+\))( ?)/", "", $name);

Чтобы сопоставить символ "$" или любое выражение в скобках в начале и удалить его. Любой вход с кронштейнами работает хорошо.

$name = "$ blah";
$matchedName = preg_replace("/^(\$|\(.+\))( ?)/", "", $name);
var_dump($matchedName);

Output:
string(8) "$ blah"

Теперь, я что-то пропустил? Или эта функция действительно была проблемой в случае символа "$"?

Спасибо за любые ответы

  • 0
    Итак, вы хотите удалить пробел в строке?
  • 0
    Какой желаемый результат?
Теги:
special-characters
preg-replace

2 ответа

0
Лучший ответ
$re = "/^(\\$|\\(.+\\))( ?)/im";
$str = "\$ blah";
$subst = "";

$result = preg_replace($re, $subst, $str);

Попробуйте это. Это работает.

  • 0
    Спасибо, работает хорошо.
  • 0
    Почему понизили ?????????????
Показать ещё 2 комментария
2

Вам нужно уйти от \, поэтому ваш код должен быть:

$name = "$ blah";
$regex = "/^(\\\$|\(.+\))( ?)/";
$matchedName = preg_replace($regex, "", $name);

var_dump($regex);
var_dump($matchedName);

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

Проблема в том, что вы находитесь в двойных кавычках ("..."), поэтому интерпретатор PHP интерпретирует первый \ как просто экранирующий $ в строке, а не как литерал \. Он должен быть буквальным \ для того, чтобы избежать символа в регулярном выражении.

Поэтому ваше текущее регулярное выражение выглядит так, как только его интерпретирует процессор: /^($|\(.+\))(?)/. Вам нужно избегать двойных кавычек $ inside и предоставлять косую черту в контексте регулярного выражения, поэтому вы добавляете \\.

Обратите внимание, что вы можете избежать этого, просто используя одиночные кавычки ('...') вместо этого, и вам понадобится только \$ вместо \\\$:

$name = "$ blah";
$regex = '/^(\$|\(.+\))( ?)/';
$matchedName = preg_replace($regex, "", $name);

var_dump($regex);
var_dump($matchedName);

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

  • 0
    Это выглядит как правильное объяснение, однако оно не соответствует действительности. Попробуйте использовать echo() в исходном регулярном выражении вместо использования его с preg_match() и вы обнаружите, что PHP не интерпретирует знак доллара ( $ ) как переменную (поскольку за ним не следуют символы, которые разрешены в переменной имена).
  • 0
    Я думаю, вы меня не так поняли. Я не говорю, что PHP иначе интерпретировал бы это как переменную. Я говорю, что первая косая черта ничего не дает, кроме как сказать, что $ - буквальный символ.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню