我的麻烦是将包含各种字符的字符串中的数字相乘。
例如,
输入:
$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
。
答案 0 :(得分:10)
$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);
以上内容仅替换后跟px
,em
或%
的数字。
您还可以自己为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对正则表达式的处理。