php preg_split ().Не правильный шаблон и переводит точку в запятую? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть вопрос.Я хочу масштабировать некоторые значения CSS, которые я храню в значениях.(упрощенно) Я сделал функцию для их увеличения.

Две вещи, которые я не понимаю.

  • Шаблон, похоже, расщепляет только один символ, а не остальные
  • Похоже, он преобразуетпериод, который он находит до запятой ??
$string = '0.3rem';
$scale = 1.5;
echo calcCssNewValue( $string, $scale ); 

function calcCssNewValue( $string, $scale ){

    $stringArray = preg_split('/[a-zA-Z]*/', $string, 2, PREG_SPLIT_DELIM_CAPTURE);

    if (  count( $stringArray ) == 1 ) {
        $returnVal = (  $stringArray[0] * $scale) ;
    } else {
        $returnVal = ( $stringArray[0] * $scale) . $stringArray[1];
    }

    return $returnVal;
}

result: '0,45em' expected: '0.45rem' Обратите внимание, что в нем отсутствует r и вместо точки стоит запятая.

Где я ошибся?:)

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Большая часть решения взята из @Rarst в этом посте.

Я получил этот код:

function calcCssNewValue( $string, $scale ){

    $stringArray = preg_split( '/([a-zA-Z]+)/', $string, 2, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY );

    $returnVal = number_format( (  $stringArray[0] * $scale ), 2, '.', ''); ;

    if (  count( $stringArray ) > 1 ) {

        $returnVal .= $stringArray[1];
    }

    return $returnVal;

}

$stringArray от @ Rarst.

$returnVal Я добавил number_format().И заставил десятичную точку в фактическую точку.Каким-то образом, и я не знаю почему, он изменил десятичную запятую на запятую.Но только когда занимаюсь математикой ...

0 голосов
/ 20 февраля 2019

Я не получаю тот же результат при выполнении вашего кода, результаты для меня разбиваются на массив пустой строки и исходное значение.*, вероятно, является проблемой, поскольку он соответствует нулю совпадениям шаблона.

Так что не уверен насчет запятой, так как я ее не вижу.

Iбудет корректировать ваше разбиение следующим образом:

$stringArray = preg_split( '/([a-zA-Z]+)/', $string, 2, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY );

Это требует:

  • паттерна для соответствия как минимум один раз
  • оборачивая его в () делает захват захвата разделителем, поскольку он применяется только к этому
  • , не добавляя пустых капель, оставляя пустой элемент (шаблон, кажется, не учитывает ограничение в два)
...