2013-05-29 61 views
1

RTLIT紅寶石工具被用於從LTR切換到RTL在CSS文件,但它並沒有改變也填充,餘量留給右擊例如:RTLIT CSS填充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; 

,我們需要與第4個值隨時切換第二值,如果他們僅僅3開關的第二個值至第四並將第二個設置爲0

如果只有2個值,則保持原樣。

我需要在紅寶石或php

回答

0

正則表達式試試這個在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') 
+0

似乎不錯,但此行'填充:2px的0 4px'應該是'填充:0 0 4PX 2px',如果有這樣的'填充負數:-1px 0 3px的4px'它不行 ! –

+0

@MSamir:你無法在一種模式中做到這一點!您必須首先在4個參數規則中轉換3個參數規則(添加0)。對於負面參數,你可以很容易地添加一個條件 - –

+0

好吧,這很好,謝謝。 –

0

我想出了這個。它有點詳細,但它,它的工作..

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