负数preg_match_all

时间:2015-11-27 07:46:54

标签: preg-match-all

Hi All im One函数将ltr css转换为rtl,但不能通过任何格式正确运行我的函数

public function rtlMargin($string)
{
    $string = trim($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
            if ($c == 2)
                $order = implode(' ', array(
                    $p['0'],
                    0,
                    0,
                    $p['1']));
            else
            if ($c == 2)
                $order = implode(' ', array(
                    $p['0'],
                    0,
                    0,
                    $p['1']));
            else                
                $order = implode(' ', $p);

        if (preg_match('/auto/',$string)) {
            return 'margin: ' . $order . ' auto;' . '<br />';
        }
        else
        {
            return 'margin: ' . $order . ';' . '<br />';
        }            
    }

    return $string;
}

代码测试功能是     $ res。= $ MyConverter-&gt; rtlMargin(“margin:1px 2px 3px 4px”);

输出是 保证金:1px 4px 3px 2px;

但是

$res .= $MyConverter->rtlMargin("margin:1-px 2px 3-px 4px");

输出为空错误

if (preg_match_all('~(-[0-9]+(px|%)?)~i', $string, $matches))

1 个答案:

答案 0 :(得分:0)

在你的代码中,正则表达式只匹配带有减号的大小,例如: - 10px或-30%,你需要使“ - ”可选地放“?” (问号)之后,与“px”或“%”是可选项的方式相同:(px|%)?

Your regexp:    '~(-[0-9]+(px|%)?)~i'
Correct regexp: '~(-?[0-9]+(px|%)?)~i'

PS:请注意,3-px不是有效的负边距,正确的语法是-3px。无论如何,如果你仍想匹配3-px,你可以使用这个正则表达式:'~(-?[0-9]+-?(px|%)?)~i'

参考: http://php.net/manual/en/regexp.reference.meta.php