Cri*_*oma 7 php regex parsing split
两天前,我开始研究代码解析器,但我陷入困境.
如何用不在括号内的逗号分隔字符串,让我告诉你我的意思:
我有这个字符串来解析:
one, two, three, (four, (five, six), (ten)), seven
Run Code Online (Sandbox Code Playgroud)
我想得到这个结果:
array(
"one";
"two";
"three";
"(four, (five, six), (ten))";
"seven"
)
Run Code Online (Sandbox Code Playgroud)
但相反,我得到:
array(
"one";
"two";
"three";
"(four";
"(five";
"six)";
"(ten))";
"seven"
)
Run Code Online (Sandbox Code Playgroud)
我怎么能在PHP RegEx中这样做.
先感谢您 !
Gum*_*mbo 11
你可以更容易地做到:
preg_match_all('/[^(,\s]+|\([^)]+\)/', $str, $matches)
Run Code Online (Sandbox Code Playgroud)
但是如果你使用真正的解析器会更好.也许是这样的:
$str = 'one, two, three, (four, (five, six), (ten)), seven';
$buffer = '';
$stack = array();
$depth = 0;
$len = strlen($str);
for ($i=0; $i<$len; $i++) {
$char = $str[$i];
switch ($char) {
case '(':
$depth++;
break;
case ',':
if (!$depth) {
if ($buffer !== '') {
$stack[] = $buffer;
$buffer = '';
}
continue 2;
}
break;
case ' ':
if (!$depth) {
continue 2;
}
break;
case ')':
if ($depth) {
$depth--;
} else {
$stack[] = $buffer.$char;
$buffer = '';
continue 2;
}
break;
}
$buffer .= $char;
}
if ($buffer !== '') {
$stack[] = $buffer;
}
var_dump($stack);
Run Code Online (Sandbox Code Playgroud)
嗯...确定已标记为已回答,但由于您要求一个简单的解决方案,我将尝试:
<?php
$test = "one, two, three, , , ,(four, five, six), seven, (eight, nine)";
$split = "/([(].*?[)])|(\w)+/";
preg_match_all($split, $test, $out);
print_r($out[0]);
die();
?>
Run Code Online (Sandbox Code Playgroud)
产量
Array
(
[0] => one
[1] => two
[2] => three
[3] => (four, five, six)
[4] => seven
[5] => (eight, nine)
)
Run Code Online (Sandbox Code Playgroud)
你不能,直接.你至少需要可变宽度的lookbehind,最后我知道PHP的PCRE只有固定宽度的lookbehind.
我的第一个建议是首先从字符串中提取带括号的表达式.但是,我对你的实际问题一无所知,所以我不知道这是否可行.
归档时间: |
|
查看次数: |
6474 次 |
最近记录: |