Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于内容的不同替换_Php_Regex - Fatal编程技术网

Php 基于内容的不同替换

Php 基于内容的不同替换,php,regex,Php,Regex,我需要根据值更改后缀。我的字符串是一个数字,后跟特定的单词/字母。如果数字为24、36、48、72或96,后跟小时、小时、小时、小时或小时,则将字母改为小时 比如说 24小时变为24小时或 24小时变成24小时 但是,如果数字不是24、36、48、72或96,则将字母更改为ET 240小时变成240ET或 35小时变成35小时 $re = '/(24|36|48|72|96)(hours|hour|hrs|hr|h)/mi'; $subst = '$1HR'; $

我需要根据值更改后缀。我的字符串是一个数字,后跟特定的单词/字母。如果数字为24、36、48、72或96,后跟小时、小时、小时、小时或小时,则将字母改为小时

比如说 24小时变为24小时或 24小时变成24小时

但是,如果数字不是24、36、48、72或96,则将字母更改为ET

240小时变成240ET或 35小时变成35小时

$re = '/(24|36|48|72|96)(hours|hour|hrs|hr|h)/mi';
        $subst = '$1HR';
        $iText = preg_replace($re, $subst, $iText);
这一部分是有效的,但我不知道如何添加将文本更改为FH的其他选项。这可以通过正则表达式一次完成吗?我怀疑它可以,正则表达式的威力是惊人的,我只是不太擅长它。

你可以使用它

$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)
请参阅和

详细信息

  • \b
    -单词边界
  • (?:(24 | 36 | 48 | 72 | 96)|(\d+)
    -匹配两个备选方案之一的非捕获组:
  • (h(?(?:ou)rs?)
    -第2组:
    h
    ,然后是可选
    ou
    的可选序列,然后是
    r
    ,然后是可选
    s
  • \b
    -单词边界
如果第1组匹配,则将
HR
后缀添加到第1组中捕获的数字,否则,
ET
将添加到第2组中捕获的数字

:


这很好,今天我学习了preg_replace_回调。非常感谢。
$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