我正在寻找使用以下格式获取数据的php中的正则表达式:
"1,2,3;7,1,3;1" returns an $matches array with "(1,2,3,7,1,3,1)"
"1" returns an $matches with "(1)"
"1;1;3;5;7;10;999" returns an $matches array with "(1,1,3,5,7,10,999)"
"1,1,1;2,5;3,4" doesn't pass since numbers are repeating within semicolon boundaries
"2,3,4;5,;" doesn't pass since it doesn't satisfy the format.
(示例中的引号是为了使它们更容易阅读;它们不应出现在实际结果中。)
格式是用逗号或分号分隔的数字数字,在分号内,它们不相互重复。 不应接受任何其他格式。
我试过了/(^(\d{1,3})$)|(([0-9]+)([,|;]{1}[0-9]+)+)/
,但它没有用。
我也试过/[0-9]+([,|;]{1}[0-9]+)+/
,但它也没有用。当我得到$ matches数组时,它没有我需要的值,如上所述。
我在 PHP 5.2 中这样做。 感谢。
答案 0 :(得分:2)
这个特殊问题对正则表达式的实用性有太多的逻辑;这是你用常规代码解决它的方法:
// reduction function - keeps merging comma separated arguments
// until there's a duplicate or invalid item
function join_unique(&$result, $item)
{
if ($result === false) {
return false;
}
$items = explode(',', $item);
$numbers = array_filter($items, 'is_numeric');
if (count($items) != count($numbers)) {
return false;
}
$unique = array_unique($numbers);
if (count($unique) != count($numbers)) {
return false;
}
return array_merge($result, $numbers);
}
// main function - parse a string of comma / semi-colon separated values
function parse_nrs($str)
{
return array_reduce(explode(';', $str), 'join_unique', array());
}
var_dump(parse_nrs('1,2,3;7,1,3;1'));
var_dump(parse_nrs('1'));
var_dump(parse_nrs('1;1;3;5;7;10;999'));
var_dump(parse_nrs('1,1,1;2,5;3,4'));
var_dump(parse_nrs('2,3,4;5,;'));
输出:
array(7) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
[3]=>
string(1) "7"
[4]=>
string(1) "1"
[5]=>
string(1) "3"
[6]=>
string(1) "1"
}
array(1) {
[0]=>
string(1) "1"
}
array(7) {
[0]=>
string(1) "1"
[1]=>
string(1) "1"
[2]=>
string(1) "3"
[3]=>
string(1) "5"
[4]=>
string(1) "7"
[5]=>
string(2) "10"
[6]=>
string(3) "999"
}
bool(false)
bool(false)
答案 1 :(得分:1)
一步到位是不可能的。首先,您需要检查在分号边界内重复的数字的要求,然后如果通过该检查则拆分字符串。
例如:
if (!preg_match('/\b(\d+),[^;]*\b\1\b/', $string)) {
$matches = preg_split('/[,;]/', $string);
} else {
$matches = NULL;
}
Ideone:http://ideone.com/Y8xf1N