我想操纵以下字符串
$str = "3 year 2 month week day 2 hour 12 minute 60 second";
将非数字(例如,将week
更改为1 week
,将day
更改为1 day
,然后对所有数字都加上减号,使字符串像
$str = "-3 year -2 month -1 week -1 day -2 hour -12 minute -60 second";
如何实现这一目标!
另一个例子
$str = "2 year month day";
到
$str = "-2 year -1 month -1 day";
答案 0 :(得分:2)
在此,最好使用 regexp替换。
1。首先,在每个未加数字([0-9])的单词前加1:
$str = preg_replace("/(^|[^0-9]\s)([A-Z])/i", "$1 1 $2", $str);
详细信息:
(^|[^0-9]\s)([A-Z])
:所有字母({{1}是检索和捕获(因为它被()
包围) }})之前是行首(([A-Z])
)或数字后面是空白(^
),也被删除了;这是我们如何检测数字之前没有的单词的方法; [^0-9]\s
:执行不区分大小写的检索(无需编写 [A-Za-z] ))
然后在一系列数字之前加上减号; /i
:写下捕获的图形("$1 1 $2"
),空格,1图形和字母序列($1
) 2。然后,在所有数值之前加上减号$2
-
在这里,$str = preg_replace("/[0-9]+/", "-$0", $str);
包含整个匹配的字符串。
工作示例:
$0
输出:
$str = "year 2 month week day 2 hour 12 minute 60 second";
echo $str . "<br/>";
$str = preg_replace("/(^|[^0-9]\s)([A-Z])/i", "$1 1 $2", $str);
echo $str . "<br/>";
$str = preg_replace("/[0-9]+/", "-$0", $str);
echo $str . "<br/>";
奖金:一次通话的备用版本:
year 2 month week day 2 hour 12 minute 60 second
1 year 2 month 1 week 1 day 2 hour 12 minute 60 second
-1 year -2 month -1 week -1 day -2 hour -12 minute -60 second
答案 1 :(得分:0)
这里是一种方法,将其在空格字符处分成多个部分,然后检查每个单独部分是否为数字,然后“回头看”前面的部分,以确定是否为以下情况之一:我们只有一个没有任何值的“单位”。
请注意,这仅适用于您显示的非常严格的格式;缺少空格或类似内容可能会使它损坏。
<?php
$str = "3 year 2 month week day 2 hour 12 minute 60 second";
$parts = explode(' ', $str); // split at space
$result = [];
$prevPartWasNum = false; // flag to remember if the previous part was numeric or not
foreach($parts as $part) {
if(is_numeric($part)) { // if the part is numeric, we need to check whether to add -
$result[] = ($part < 0 ? '' : '-') . $part;
$prevPartWasNum = true;
}
else {
if($prevPartWasNum) { // if the previous part was nummeric, we can add straight away
$result[] = $part;
}
else { // otherwise we have to introduce the additional -1
$result[] = '-1 ' . $part;
}
$prevPartWasNum = false;
}
}
echo implode(' ', $result);
答案 2 :(得分:0)
这是一个示例:
$keywords = array('year','week','month','day','hour','minute','second');
$str = "3 year 2 month week day 2 hour 12 minute 60 second";
$str = str_replace(' ', '', $str);
foreach($keywords as $keyword){
if($pos=strpos($str,$keyword)){
if(is_numeric($str[$pos-1]) ==0){
$str= substr($str, 0 ,$pos ).'1'.substr($str,$pos,strlen($str));
}
}
}
$str = preg_replace('([0-9]+)' , ' -$0 ',$str);
echo $str;
结果:
-3 year -2 month -1 week -1 day -2 hour -12 minute -60 second