воссоздать функцию соответствия js regex в php - PullRequest
1 голос
/ 05 марта 2019

У меня проблема с функцией отдыха, написанной на Javascript, чтобы она работала в php.Я думаю, что я очень близок, но не очень хорошо понимаю синтаксис php.Итак, у меня есть что-то подобное в JS:

function convertStr(str, id) {
  const regexExpression = new RegExp('PR|PD|DD|DPD|DP_AVG', 'g');
  return str.replace(regexExpression, match => match + id);
}

Поэтому я пытаюсь сделать то же самое в php, и у меня есть это:

$reg = "/PR|PD|DD|DPD|DP_AVG\g/";
$result = preg_replace($reg, ??, $str)

Так что я не знаю, что поставитьв «??», потому что, как я понимаю в JS, это моя функция сопоставления стрелок match => match + id, но я не могу выполнить ее в PHP.Кто-нибудь может помочь?

Бест,

Петр

Ответы [ 2 ]

2 голосов

Вы также можете использовать preg_replace_callback(): http://php.net/manual/en/function.preg-replace-callback.php

Этот метод примет функцию в качестве второго параметра, который совпадает с версией JS.

$str = "...";
$id = 0;
preg_replace_callback("Your regex expression", function($match) {
    return $match[0] + $id;
}, $str);
2 голосов
/ 05 марта 2019

Вы не должны использовать глобальный модификатор в функциях PHP preg, есть определенные функции или аргументы, которые управляют этим поведением.Например, preg_replace заменяет все вхождения во входной строке по умолчанию.

Использовать

function convertStr($str, $id) {
  $regexExpression = '~PR|PD|DD|DPD|DP_AVG~';
  return preg_replace($regexExpression, '$0' . $id, $str);
}

Здесь

  • ~PR|PD|DD|DPD|DP_AVG~ - это регулярное выражение, соответствующеенесколько альтернативных подстрок (обратите внимание на символы ~, используемые в качестве разделителя регулярных выражений, в JS для этого можно использовать только / в буквенной нотации регулярных выражений)
  • В замене $0 означает целоезначение совпадения (такое же, как $& в регулярном выражении JS), и $id просто добавляется к этому значению.

Итак, в версии JS я бы рекомендовал использовать

return str.replace(regexExpression, "$&" + id);
...