Умножьте числа в смешанной строке - PullRequest
4 голосов
/ 10 ноября 2011

Моя проблема заключается в умножении чисел в строке, содержащей различные символы.

Например,

Введите:

$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 ]

10 голосов
/ 10 ноября 2011

Я бы использовал 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);

Выше указаны только цифры, за которыми следуют px, em или %.

Вы также можете сами предоставить $k лямбда-функции для большей гибкости:

$k = 2;
$output = preg_replace_callback('/([0-9]+)\s*(px|em|%)/i', function($matches) use ($k){
   return ($matches[1] * $k).$matches[2];
}, $input);
6 голосов
/ 10 ноября 2011
$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, вы должны создать лямбда-функцию, используя <a href="http://www.php.net/manual/en/function.create-function.php" rel="nofollow"> create_function () .

5 голосов
/ 10 ноября 2011
preg_replace('/\d+/e', '$0 * $k', $input);
1 голос
/ 10 ноября 2011

Итерация по строке char по char и логическое отслеживание того, когда вы находите символ, который можно интерпретировать как int (подсказка: is_int). Если вы находитесь в int, отслеживайте символы, которые вы проходите, и объединяйте их в строку. Как только вы найдете символ, который не является целым, прекратите конкаттацию на строку. Преобразуйте эту строку в число и умножьте на два. Поместите его в нужное место в строке (вы знаете, потому что вы отметили начало и конец целого числа).

Или просто сделайте то, что Джон Кугельман, AndreKR и netcoder сделали с регулярными выражениями.

1 голос
/ 10 ноября 2011

Вы можете сделать это очень легко с помощью небольшого регулярного выражения:

$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-разбор, если вы хотите этого избежать.

Вы также можете обнаружить, что ваши стили не так легко удваиваются ...

...