2016-04-21 116 views
0

我在正则表达式上相当薄弱,这给我一个头痛,试图弄清楚。我只是试图从字符串中提取时间并修改时间的文本。我得到的字符串有以下几种形式:PHP preg_replace多个替换

"Some text I don't care about | 2.3 seconds ago" 
"Some text I don't care about | 5.2 minutes ago" 
"Some text I don't care about | 7.0 hours ago" 
"Some text I don't care about | 1.9 days ago" 

我想换成上述字符串它们分别是在形式:

"2.3 secs" 
"5.2 mins" 
"7.0 hrs" 
"1.9 days" 

我知道正则表达式替换的基础知识,但删除多个我想要的文本前后的东西,而用“hrs”替换“小时”等,超出了我的正则表达式技能水平。

任何帮助,将不胜感激。

感谢。

编辑:

搞乱我使用多个不同的功能来解决好了后。我不完全喜欢它,但它有效。如果可能,我宁愿单个preg_replace解决方案。这是我目前解决方案:

$testString = "This is text I don't care about | 7.3 seconds ago"; 
$testString = array_shift(array_reverse(explode('|', $testString))); 
$pattern = array('/seconds/', '/minutes/', '/hours/', '/ago/'); 
$replace = array('secs', 'mins', 'hrs', ''); 
$testString = trim(preg_replace($pattern, $replace, $testString)); 

输出为:7.3 secs

+0

你想为多个字符串一个接一个,或一个包含多个句单一的字符串进行替换? – RomanPerekhrest

+0

字符串将被逐个处理 – Wallboy

+0

可以使用一个preg_replace调用和一个正则表达式。 –

回答

1

如果你真的想在同一行的查找/替换,你可以做这样的事情:

$time_map = array(
    'seconds' => 'secs', 
    'minutes' => 'mins', 
    'hours' => 'hrs', 
    'days' => 'days', 
); 

$data = array(
    "Some text I don't care about | 2.3 seconds ago", 
    "Some text I don't care about | 5.2 minutes ago", 
    "Some text I don't care about | 7.0 hours ago", 
    "Some text I don't care about | 1.9 days ago", 
); 

foreach ($data as $line) { 
    $time_data = preg_replace_callback("/(.*|\s*)([0-9]+\.[0-9]+) (\w+) ago/", function ($matches) use ($time_map) {return $matches[2] . " " . $time_map[$matches[3]];}, $line); 
    print "$time_data\n"; 
} 

主要生产:使用preg_match

2.3 secs 
5.2 mins 
7.0 hrs 
1.9 days 
+0

谢谢,那会很好。 – Wallboy

0

preg_replace有一个可选的第四个参数是一个限制。 该限制是它可以替代的最大匹配数量。 Php preg_replace它是自动全局的,这意味着它会替换所有匹配,除非您将正数设置为限制。

http://php.net/manual/en/function.preg-replace.php

0

简单的解决方案str_replace功能:

$testString = "This is text I don't care about | 7.3 seconds ago"; 
$timeUnitsmap = ["secs" => "seconds", "mins" => "minutes", "hrs" => "hours"]; 

preg_match("/\b[0-9.]+? \w+?\b/i", $testString, $matches); 
$testString = str_replace(array_values($timeUnitsmap), array_keys($timeUnitsmap), $matches[0]); 

print_r($testString); // "7.3 secs" 

或者使用preg_replace_callbackarray_search功能:

... 
$testString = preg_replace_callback(["/.*?\b([0-9.]+?)(\w+?)\b.*/"], function($m) use($timeUnitsmap){ 
    return $m[1]. array_search($m[2], $timeUnitsmap); 
}, $testString);