php preg_split()。

时间:2019-02-19 20:56:16

标签: php regex preg-split

我有一个问题。我想缩放一些已存储在值中的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 :(得分:3)

在运行您的代码时没有得到相同的结果,在空字符串和原始值数组中为我分割的结果。 *可能是问题所在,因为它与模式的匹配。

所以也不确定逗号,因为我看不到。

我会像这样调整您的拆分,似乎可以完成:

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

这需要:

  • 模式至少匹配一次
  • 将其包装在()中使定界符捕获工作起作用,因为它仅适用于该定居器
  • 不添加任何空投掷物,而使空项徘徊不前(模式似乎不算作两个限制)

答案 1 :(得分:0)

解决方案的最大部分来自@Rarst in this post.

我最终得到了以下代码:

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的{​​{1}}。并将小数点强制为实际点。不知何故,我不知道为什么,它将小数点更改为逗号。但是只有在做数学时...