PHP с использованием preg_replace: ошибка «Разделитель не должен быть буквенно-цифровым или с обратной косой чертой» - PullRequest
32 голосов
/ 27 марта 2010

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

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

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

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

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

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

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

Внимание

Есть мысли? Я знаю, что здесь есть и другие вопросы, вроде ответа на этот вопрос, но моих знаний о регулярных выражениях недостаточно, чтобы переключиться на этот пример.

Ответы [ 5 ]

44 голосов
/ 27 марта 2010

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

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

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

$result = preg_replace("#\((\d+)\)#", "$1", $string);
5 голосов
/ 27 марта 2010

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

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

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

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

Нечто подобное должно работать. Любые дальнейшие вопросы, перейдите к PHP preg_replace() документации - это действительно хорошо.

2 голосов
/ 27 марта 2010

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

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

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

0 голосов
/ 29 августа 2018

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

попробуйте ввести свои параметры внутри "/ .... /", как показано ниже. В противном случае код будет выводиться >>> Разделитель не должен быть буквенно-цифровым или с обратной косой чертой.

$yourString='hi there, good friend';
$dividorString='there';
$someSstring=preg_replace("/$dividorString/",'', $yourString);

echo($someSstring);

// hi, good friend

. , работал на меня.

0 голосов
/ 27 марта 2010

Попробуйте:

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

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

...