^([0-9]+[abc])+$
。因此,有效字符串的示例可以是:'1a2b'或'00333b1119a555a0c'。为了清晰起见,该字符串是(值,字母)对列表,顺序很重要。我被卡住了输入字符串,所以无法更改它。虽然使用上面的正则表达式测试正确语法在原则上很容易,但我正在尝试想出在PHP中将符合规范的字符串转换为可用数组的最有效方法,类似于以下内容:
输入:
'00333b1119a555a0c'
输出:
array (
0 => array('num' => '00333', 'let' => 'b'),
1 => array('num' => '1119', 'let' => 'a'),
2 => array('num' => '555', 'let' => 'a'),
3 => array('num' => '0', 'let' => 'c')
)
我在使用 preg_match 这个函数的时候遇到了一些困难。例如,下面这段代码并不能得到预期结果,其意图是贪婪地匹配 \d+(并保存)或 [abc](并保存),直到匹配到字符串的结尾。
$text = '00b000b0b';
$out = array();
$x = preg_match("/^(?:(\d+|[abc]))+$/", $text, $out);
这也行不通,意图是贪婪匹配 \d+[abc](并保存这些内容) ,重复直到到达字符串结尾,然后将其拆分为数字和字母。
$text = '00b000b0b';
$out = array();
$x = preg_match("/^(?:\d+[abc])+$/", $text, $out);
我原本计划在 preg_match 中检查语法,然后使用 preg_match 输出来贪婪匹配“块”(或者如果使用 preg_split,则保留分隔符),然后如果需要,使用 for (...; i+=2)
循环遍历结果中的每两个项目,以提取值-字母对。
但是,我似乎甚至无法顺利地运行基本的 preg_split() 或 preg_match() 方法,更不用说探索是否有更“整洁”或更有效的方法了。
$input
进行检查,因为当前一个无效的字符串仍会产生有效的结果。可以使用类似if (preg_match('/^([0-9]+[abc])+$/',$input) == 1){...
的语句进行检查。 - Tigger