Как заменить только конец строки на число - preg_replace php - PullRequest
0 голосов
/ 26 октября 2018

Вот моя строка.

$text = 'I am  [pitch = "high"]Rudratosh Shastri[endpitch]. what is your name ? how  are you? sorry [pause ="3000"] i can not hear you ?[rate="-70.00%"] i still can\'t hear you[endrate] ? [rate="+50.00%"]why i can\'t hear you[endrate] ?';

Я хочу заменить [pause = "3000"] на <break time="3000ms">

Я написал следующее регулярное выражение, но он выбирает до последнего "]

\[pause.*\"(\d+)\".*\"]

PHP: $text = preg_replace("/\[pause.*\"(\w+)\".*\"]/", '<break time="$1ms"/>', $text);

Если бы я нашел решение, в котором регулярное выражение выбирает только «любое число»

any number"]

, моя проблема была бы решена.

Но я не могу найти, как это сделать.

У вас есть какие-либо предложения?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Ваше регулярное выражение слишком много соответствует последней части .*\" Если вы удалите эту часть, у вас будет совпадение с данными текущего примера, но первое .* по-прежнему соответствует любому символу, включая, например, такие символы, как "[],

Что вы можете сделать, это заменить это первое .*, сопоставив знак равенства, окруженный символом горизонтального пробела, таким как \h*=\h*

Обратите внимание, что вам не нужно избегать двойной кавычки.

Вы можете использовать:

\[pause\h*=\h*"(\d+)"]

Regex demo

Это будет соответствовать

  • \[pause Совпадение [pause
  • \h* Совпадение с нулем или более горизонтальных пробельных символов
  • = Совпадение =
  • \h*" Совпадение с нулем или более горизонтальных пробельных символовсимволы, за которыми следует "
  • (\d+) Захват в группе одной или нескольких цифр
  • "] Соответствие "]

И заменить на:

<break time="$1ms"> или используйте <break time="$1ms"/>

Например:

$text = 'I am  [pitch = "high"]Rudratosh Shastri[endpitch]. what is your name ? how  are you? sorry [pause ="3000"] i can not hear you ?[rate="-70.00%"] i still can\'t hear you[endrate] ? [rate="+50.00%"]why i can\'t hear you[endrate] ?';
$text = preg_replace('/\[pause\h*=\h*"(\d+)"]/', '<break time="$1ms"/>', $text);
echo $text;

Демо

0 голосов
/ 26 октября 2018

Вы можете использовать

\[pause[^]]*"(\d+)"]

или (если после цифр может быть что-то еще):

\[pause[^]]*"(\d+)"[^]]*]
                   ^^^^^

и заменить на <break time="$1ms"/>.См. regex demo

Подробности

  • \[pause - [pause подстрока
  • [^]]* -0+ символов кроме ]
  • " - двойная кавычка
  • (\d+) - группа 1: одна или несколько цифр
  • "] - a"] подстрока.

PHP демо :

$str = 'I am  [pitch = "high"]Rudratosh Shastri[endpitch]. what is your name ? how  are you? sorry [pause ="3000"] i can not hear you ?[rate="-70.00%"] i still can\'t hear you[endrate] ? [rate="+50.00%"]why i can\'t hear you[endrate] ?';
echo preg_replace('~\[pause[^]]*"(\d+)"]~', '<break time="$1ms"/>', $str);
// => I am  [pitch = "high"]Rudratosh Shastri[endpitch]. what is your name ? how  are you? sorry <break time="3000ms"/> i can not hear you ?[rate="-70.00%"] i still can't hear you[endrate] ? [rate="+50.00%"]why i can't hear you[endrate] ?
...