Php 基于内容的不同替换
我需要根据值更改后缀。我的字符串是一个数字,后跟特定的单词/字母。如果数字为24、36、48、72或96,后跟小时、小时、小时、小时或小时,则将字母改为小时 比如说 24小时变为24小时或 24小时变成24小时 但是,如果数字不是24、36、48、72或96,则将字母更改为ET 240小时变成240ET或 35小时变成35小时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'; $
$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+)
-第2组:(h(?(?:ou)rs?)
,然后是可选h
的可选序列,然后是ou
,然后是可选r
s
-单词边界\b
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