PHP, использующий preg_replace: “Разделитель не должен быть алфавитно-цифровым или обратная косая черта” ошибка

Я пытаюсь взять строку текста как так:

$string = "This (1) is (2) my (3) example (4) text";

В каждом экземпляре, где существует положительное целое число в круглых скобках, я хотел бы заменить это просто целым числом самим.

Код, который я использую теперь:

$result = preg_replace("\((\d+)\)", "$0", $string);

Но я продолжаю получать a

Разделитель не должен быть алфавитно-цифровым или обратная косая черта.

Предупреждение

Какие-либо мысли? Я знаю, что существуют другие вопросы на здесь таком отвечать на вопрос, но моего знания regex недостаточно для переключения его на этот пример.

33
задан Pmpr 8 June 2018 в 08:28
поделиться

4 ответа

Попробуйте:

<?php
$string = "This (1) is (2) my (3) example (4) text";
$output = preg_replace('/\((\d)\)/i', '$1', $string);
echo $output;
?>

Символы в скобках - это специальные символы в регулярном выражении. Вам нужно убежать от них, чтобы использовать их.

0
ответ дан 27 November 2019 в 18:23
поделиться

1) Вам нужен разделитель, / работает нормально.

2) Вы должны экранировать символы ( и ) , чтобы он не думал, что это еще одна группировка.

3) Кроме того, заменяемые переменные здесь начинаются с 1, а не с 0 (0 содержит ПОЛНОЕ текстовое совпадение, включая круглые скобки).

$result = preg_replace("/\((\d+)\)/", "\\1", $string);

Что-то вроде этого должно сработать. Если у вас возникнут дополнительные вопросы, обратитесь к документации PHP preg_replace () - это действительно хорошо.

6
ответ дан 27 November 2019 в 18:23
поделиться

Вы почти у цели. Вы используете:

$result = preg_replace("((\d+))", "$0", $string);
  • Регулярное выражение, которое вы указываете в качестве первого аргумента для preg _ * семейства функций , должно быть разделено парой разделителей . Поскольку вы не используете никаких разделителей, вы получите эту ошибку.
  • ( и ) - это мета-символы в регулярном выражении, означающие, что они имеют особое значение. Поскольку вы хотите сопоставить литерал open круглые скобки и закрывающие скобки, вам нужно экранировать их, используя \ . Все, что следует за \ , обрабатывается буквально.
  • Вы можете правильно записать целое число , используя \ d + . Но захваченное целое число будет в $ 1 , а не в $ 0 . $ 0 будет иметь полное совпадение, то есть целое число в скобках.

Если вы сделаете все вышеупомянутые изменения, вы получите:

$result = preg_replace("#\((\d+)\)#", "$1", $string);
44
ответ дан 27 November 2019 в 18:23
поделиться

Проверьте документы - вам необходимо использовать разделитель до и после ваш шаблон: "/ \ ((\ d +) \) /"

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

См .: страница руководства preg_replace

2
ответ дан 27 November 2019 в 18:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: