RTLIT ruby工具用于在css文件中从LTR切换到RTL,但它也不会改变填充,左边距为righ,例如:
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个值,请保持原样。
我需要在ruby或php中使用正则表达式
答案 0 :(得分: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);
用ruby:
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')
答案 1 :(得分: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