preg_match问题

时间:2011-03-19 04:29:28

标签: php regex match

我讨厌正则表达式,但对于我正在做的事情,我确信没有其他更简单的选择。 无论如何,我一直在研究这个问题:

/(([a-zA-z_]+)[\.]?+)+/

尝试匹配与此类似的内容

"text.lol".something.another etc..

使用preg_match返回类似于

的数组
Array
(
    [0] => "text.lol"
    [1] => something
    [2] => another
)

但我得到的只是数组中第一个匹配的项目两次?

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

这为您指定的输入提供了所需的输出:

$s = '"text.lol".something.another';
preg_match_all('/"[^"]+"|[^.]+/', $s, $m);
$values = $m[0];
print_r($values);

这是一个允许转义引号的完整实现:​​

function encode($original) {
    foreach ($original as &$s) {
        $s = addslashes($s);
        if (strpos($s, '.') !== false) $s = '"'.$s.'"';
    }
    return join('.', $original);
}

function decode($s) {
    // These regular expressions courtesy of ridgerunner:
    preg_match_all('/"([^"\\\\]*+(?:\\\\.[^"\\\\]*)*)"|([^.]+)/', $s, $m);
    // This one has poorer performance, but is easier to read:
    // preg_match_all('/"((?:\\\\.|[^"\\\\])+)"|([^.]+)/', $s, $m);
    $values = array();
    foreach ($m[1] as $k => $v) $values[] = stripslashes($v? $v : $m[2][$k]);
    return $values;
}

$test_cases = array('a.b', 'a\\', '.a\\', 'a.b"c', '"a');
$encoded = encode($test_cases);
$decoded = decode($encoded);

echo '<pre>Encoded: '.$encoded."\n";
echo print_r($decoded, 1).'</pre>';

输出:

Encoded: "a.b".a\\.".a\\"."a.b\"c".\"a
Array
(
    [0] => a.b
    [1] => a\
    [2] => .a\
    [3] => a.b"c
    [4] => "a
)