Различные замены в зависимости от содержания - PullRequest
4 голосов
/ 03 марта 2020

Мне нужно изменить суффикс в зависимости от значения. Моя строка - это число, за которым следуют указанные c слова / буквы. Если число равно 24, 36, 48, 72 или, 96 и за ним следуют часы, часы, часы, часы или часы, то измените буквы на HR.

Например, 24 часа - 24 часа или 24 часа становится 24Ч

Но, если число не 24, 36, 48, 72 или 96, то измените буквы на ET

240 часов станет 240ET или 35 часов станет 35ET

$re = '/(24|36|48|72|96)(hours|hour|hrs|hr|h)/mi';
        $subst = '$1HR';
        $iText = preg_replace($re, $subst, $iText);

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

1 Ответ

2 голосов
/ 03 марта 2020

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

$rx = '~\b(?:(24|36|48|72|96)|(\d+))(h(?:(?:ou)?rs?)?)\b~i';
preg_replace_callback($rx, function($m) {
  return !empty($m[1]) ? $m[1] . 'HR' : $m[2] . 'ET';
}, $s)

См. PHP demo и regex demo .

Подробности

  • \b - граница слова
  • (?:(24|36|48|72|96)|(\d+)) - группа без захвата, соответствующая любой из двух альтернатив:
  • (h(?:(?:ou)?rs?)?) - Группа 2 : h, затем необязательная последовательность необязательного ou, затем r, затем необязательный s
  • \b - граница слова.

Если Группа 1 соответствует, суффикс HR добавляется к номеру, захваченному в группе 1, в противном случае ET добавляется к номеру, захваченному в группе 2.

Полный PHP демо :

$strs = ['Time 24hours','Time 36hour','Time 72hr','Time 96h','Time 24hrs','Time 35h'];
$rx = '~\b(?:(24|36|48|72|96)|(\d+))(h(?:(?:ou)?rs?)?)\b~i';
foreach ($strs as $s) {
  echo preg_replace_callback($rx, function($m) {
    return !empty($m[1]) ? $m[1] . 'HR' : $m[2] . 'ET';
  }, $s) . PHP_EOL;
}
// => Time 24HR
// Time 36HR
// Time 72HR
// Time 96HR
// Time 24HR
// Time 35ET
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...