在混合字符串中相乘


Multiply numbers in mixed string

我的麻烦是在包含各种字符的字符串中相乘。

例如,

输入:

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

输出:

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

编辑

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

我会使用preg_replace_callback:

$input = '<div style="padding:10px 15px; font-size:1em ;height:2%;"></div>';
$output = preg_replace_callback('/([0-9]+)'s*(px|em|%)/i', function($matches){
   $k = 2;
   return ($matches[1] * $k).$matches[2];
}, $input);

以上仅替换后面跟有pxem%的数字。

您也可以自己为lambda函数提供$k,以获得更大的灵活性:

$k = 2;
$output = preg_replace_callback('/([0-9]+)'s*(px|em|%)/i', function($matches) use ($k){
   return ($matches[1] * $k).$matches[2];
}, $input);
$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);

这使用了自PHP 5.3以来可用的匿名函数。如果你想在PHP<5.3您必须使用create_function((创建一个lambda函数。

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);

这使用了PHP 5.3中引入的匿名函数语法。请注意,这将更改字符串中的所有数字,而不仅仅是style属性中的数字。如果您想避免这种情况,就需要使用DOM解析。

你可能也会发现你的风格不会那么容易翻倍。。。

逐字符遍历字符串,并使用布尔值跟踪何时找到可以解释为int的字符(提示:is_int(。如果您在int中,请跟踪正在遍历的字符,并将它们连接到字符串中。一旦找到一个不是int的字符,就停止将其插入字符串。将这个字符串转换成数字并乘以2。把它放在字符串的正确位置(因为你标记了整数的开始和结束,所以你知道这一点(。

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