Php 用混合字符串乘法

Php 用混合字符串乘法,php,replace,numbers,Php,Replace,Numbers,我的问题是在包含各种字符的字符串中乘法 比如说, 输入: $k = 2; $input = '<div style="padding:10px 15px; font-size:1em ;height:2%;"></div>'; $k=2; $input=''; 输出: <div style="padding:20px 30px; font-size:2em ;height:4%;"></div> 编辑 $k可以是任何整数(

我的问题是在包含各种字符的字符串中乘法

比如说,

输入:

$k     = 2;    
$input = '<div style="padding:10px 15px; font-size:1em ;height:2%;"></div>';
$k=2;
$input='';
输出:

<div style="padding:20px 30px; font-size:2em ;height:4%;"></div>

编辑


$k
可以是任何整数(0-9)。
$input
字符串中的所有数字都乘以
$k

$k=2;
$k = 2;

$f = function ($i) use ($k) {
  return $i[0] * $k;
};

$s = '<div style="padding:10px 15px; font-size:1em ;height:2%;"></div>';
echo preg_replace_callback('/[0-9]+/', $f, $s);
$f=功能($i)使用($k){ 返回$i[0]*$k; }; $s=''; 回显preg_replace_回调('/[0-9]+/',$f$s);
这使用了自PHP5.3以来可用的匿名函数。如果要在PHP<5.3中使用它,必须使用创建lambda函数。

我会使用:


使用一个小正则表达式可以很容易地做到这一点:

$k = 2;
$input = '<div style="padding:10px 15px; font-size:1em ;height:2%;"></div>';

$input = preg_replace_callback('/\d+/', function($matches) use ($k) {
    return $matches[0] * $k;
}, $input);
$k=2;
$input='';
$input=preg_replace_回调('/\d+/',函数($matches)use($k){
返回$matches[0]*$k;
}美元投入);
这使用PHP5.3中引入的匿名函数语法。请注意,这将改变字符串中的所有数字,而不仅仅是
style
属性中的数字。如果要避免这种情况,需要使用DOM解析


您还可能会发现,您的样式不太容易翻倍…

逐字符遍历字符串,并有一个布尔值跟踪您何时找到可以解释为int的字符(提示:is_int)。如果是整数,请跟踪要遍历的字符,并将它们合并到字符串中。一旦您找到一个不是int的字符,就停止对字符串进行压缩。将此字符串转换为数字并乘以2。将它放在字符串中的正确位置(因为您标记了整数的开头和结尾,所以您知道这一点)


或者像John Kugelman、AndreKR和netcoder那样处理正则表达式。

$k
可以是任何整数(0-9),它将
$input
中的所有数字相乘string@enloz:你应该在问题中解释这一点;目前,它根本没有说明您的功能需求。+1您的解决方案还检查上下文(px | em |%),这是好的。另一种解决方案是在任何地方随机替换数字。可能值得推荐一种不使用匿名函数的方法,或者至少提及PHP要求etc@Ben斯文伯恩:在5.2天内,我会的。但是它不再被支持了。每个人都应该跑5.3。5.4快出局了。如果你没有升级,你肯定应该马上升级。我使用>5.3,但大型主机解决方案并不总是这样。例如,Rackspace cloud刚刚决定开始升级到5.3版,尽管已经非常晚了+1这是我大多数时候都会做的,因为我不是那种害怕
eval
的人,尽管再多检查一点(比如我对
em
等所做的检查)不会有什么坏处。:)有趣的是,我还不知道e修饰语。:)
$k = 2;
$output = preg_replace_callback('/([0-9]+)\s*(px|em|%)/i', function($matches) use ($k){
   return ($matches[1] * $k).$matches[2];
}, $input);
preg_replace('/\d+/e', '$0 * $k', $input);
$k = 2;
$input = '<div style="padding:10px 15px; font-size:1em ;height:2%;"></div>';

$input = preg_replace_callback('/\d+/', function($matches) use ($k) {
    return $matches[0] * $k;
}, $input);