将数字乘以混合字符串

时间:2011-11-10 00:00:39

标签: php replace numbers

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

例如,

输入:

$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

5 个答案:

答案 0 :(得分:10)

我使用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);

答案 1 :(得分:6)

$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中使用它&lt; 5.3你必须使用create_function()创建一个lambda函数。

答案 2 :(得分:5)

preg_replace('/\d+/e', '$0 * $k', $input);

答案 3 :(得分:1)

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

$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解析。

您可能还会发现您的风格不会轻易翻倍......

答案 4 :(得分:1)

通过char迭代字符串char,并在找到可以解释为int(hint:is_int)的字符时有一个布尔值跟踪。如果你在int中跟踪你正在遍历的字符并将它们连接到一个字符串上。只要找到一个不是int的字符就会停止在字符串上。将此字符串转换为数字并乘以2。将它放在字符串中的正确位置(您知道这是因为您标记了整数的开头和结尾)。

或者只是执行John Kugelman,AndreKR和netcoder对正则表达式的处理。