这是一个字符串:
$str = "Discount 5.5@, Update T@";
我想将符号'@'替换为'%',但前提是它有数字(int或dec):
"Discount 5.5%, Update T@"
我用:
preg_replace("/[0-9.]*@/", "%", $str);
但它只是删除%符号之前的任何数字,我做了什么?
答案 0 :(得分:2)
请参阅上面的评论。我会建议一点不同的表达方式:
preg_replace("/(\d+(?:\.\d+)?)(\s*)\@/", "$1$2%", $str);
此表达式将匹配 5 @ ,但 5.5 @ (带或不带浮点)。但是它不匹配 5。@ 。
\d
表示数字,等于[0-9]
,+
(加)表示1或更多,但不是0次。第二个表达式以?:
开头(表示不匹配为组)意味着查找。 (点)紧跟在第一个数字序列之后,后跟数字 - 整数为零或一次(不匹配 5.15.25 @ )。
然后我们检查一个空格(0次或更多次),然后在用$2
替换后将它们转回来。
答案 1 :(得分:2)
$str = preg_replace('/(?<=\d)\@/', '%', $str);
答案 2 :(得分:0)
首先检查字符串是否有数字。比做一个简单的str_replace。
$str = 'Discount 5.5@, Update T@';
preg_match_all('!\d+!', $str, $matches);
if(!empty($matches)) {
str_replace('@','%', $str);
}