【问题标题】:RTLIT css padding rtl regular expressionRTLIT css 填充 rtl 正则表达式
【发布时间】:2013-05-25 06:59:51
【问题描述】:

RTLIT ruby​​ 工具用于在 css 文件中从 LTR 切换到 RTL,但它也不会更改填充,例如从左到右的边距:

https://github.com/zohararad/rtlit/blob/master/lib/rtlit/converter.rb

padding: 1px 2px;
padding: 0 2px 4px;
padding: 1px 0 3px 4px;
padding: 1px 2px 0 4px;
padding: 1px 2px 3px 0;

需要将此值更改为:

padding: 1px 2px;
padding: 0 0 4px 2px;
padding: 1px 4px 3px 0;
padding: 1px 4px 0 2px;
padding: 1px 0 3px 2px;

我们需要始终将第二个值与第四个值切换,如果它们只有 3,则将第二个值切换到第四个并将第二个设置为 0

如果只有 2 个值,请保持原样。

我需要 ruby​​ 或 php 中的正则表达式

【问题讨论】:

    标签: php css ruby regex right-to-left


    【解决方案1】:

    在 php 中试试这个:

    $result = preg_replace ('~\b(?:padding|margin)\b\h*:\h*\K(-?\d+[a-z%]*)\h+(-?\d+[a-z%]*)\h+(-?\d+[a-z%]*)\h+(-?\d+[a-z%]*)\h*(?=;)~i', '$1 $4 $3 $2', $string);
    

    用红宝石:

    my_result = my_str.sub( %r{(?i)\b(padding|margin)\b *: *(-?\d+[a-z%]*) +(-?\d+[a-z%]*) +(-?\d+[a-z%]*) +(-?\d+[a-z%]*) *(?=;)}, '$1: $2 $5 $4 $3')
    

    【讨论】:

    • 看起来不错,但是padding: 0 2px 4px这一行应该是padding: 0 0 4px 2px,如果有像padding: -1px 0 3px 4px这样的负数,它就不起作用了!
    • @MSamir:你不能以一种模式做到这一点!您必须首先将 3 个参数规则转换为 4 个参数规则(添加一个 0)。对于负参数,您可以轻松添加条件 -
    【解决方案2】:

    我想出了这个。它有点冗长,但是,它完成了这项工作..

    function rtlPadding($string)
    {
        if (preg_match_all('~([0-9]+(px|%)?)~i', $string, $matches))
        {
            $c = count($matches['1']);
            $p = $matches['1'];
            if ($c == 4)
                $order = implode(' ', array($p['0'], $p['3'], $p['2'], $p['1']));
            else if ($c == 3)
                $order = implode(' ', array($p['0'], 0, $p['2'], $p['1']));
            else
                $order = implode(' ', $p);
    
            return 'padding: ' . $order . ';';
        }
    
        return false;
    }
    

    我测试了它,它似乎工作得很好,至少你提供的数据是这样。

    $paddings = array(
        'padding: 1px 2px;' => 'padding: 1px 2px;',
        'padding: 0 2px 4px;' => 'padding: 0 0 4px 2px;',
        'padding: 1px 0 3px 4px;' => 'padding: 1px 4px 3px 0;',
        'padding: 1px 2px 0 4px;' => 'padding: 1px 4px 0 2px;',
        'padding: 1px 2px 3px 0;' => 'padding: 1px 0 3px 2px;'
    );
    
    foreach ($paddings as $given => $expected)
    {
        $return = rtlPadding($given);
        if ($return === $expected)
            echo 'Everything OK!' . PHP_EOL;
        else
            echo 'Error! Expected ' . $expected . ' Got ' . $return . PHP_EOL;
    }
    // Output: Everything Ok, 5 times :D
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 2013-05-01
      • 2016-10-04
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      相关资源
      最近更新 更多