我讨厌正则表达式,但对于我正在做的事情,我确信没有其他更简单的选择。 无论如何,我一直在研究这个问题:
/(([a-zA-z_]+)[\.]?+)+/
尝试匹配与此类似的内容
"text.lol".something.another etc..
使用preg_match返回类似于
的数组Array
(
[0] => "text.lol"
[1] => something
[2] => another
)
但我得到的只是数组中第一个匹配的项目两次?
有人可以帮忙吗?
答案 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
)