将字符串拆分为多个部分

时间:2009-07-27 02:19:49

标签: php string extract

我在表格中有一个问题列表,其中一些只有在满足某些条件时才会显示。记录可能有简单的标准4002 = Y其中4002是问题编号,Y是答案。如果4002 = Y则显示问题。

对于只有一个标准的记录,我没有问题。

但是有些记录的标准如下:

402=Y OR 7003=Y OR 905=Y OR 7007=Y OR 7008=Y OR 7010=Y OR 7011=Y OR 7013=Y

在这种情况下,我需要评估每个选项,看看是否要显示问题。

其他问题会有类似的字符串;有些更短,有些更长。

我如何最好地分割字符串,以便我可以一次评估每个部分并仍能正确比较它们?

我可以在一定程度上重新格式化数据,但我绝不愿意,如果可能的话。

这是regex()任务(我对此还不是很熟悉)?我已经尝试list()split()explode()但收效甚微。

任何指针都会受到赞赏。

5 个答案:

答案 0 :(得分:3)

如果你的输入字符串真的只是一堆用“OR”分隔的简单标准,那么一个简单的explode()确实可以解决这个问题:

$criteria = "402=Y OR 7003=Y OR 905=Y OR 7007=Y OR 7008=Y OR 7010=Y OR 7011=Y OR 7013=Y";
$split_criteria = explode("OR", $criteria);

foreach ($split_criteria as $single)
{
    echo trim($single) . "\n";
}

然而,如果它更复杂(如果允许AND以及OR,那么)那么你将需要一个相应更智能的解析器。

答案 1 :(得分:1)

$criteria = '402=Y OR 7003=Y OR 905=Y OR 7007=Y OR 7008=Y OR 7010=Y OR 7011=Y OR 7013=Y';
$rules = array();
foreach (explode(' OR ', $criteria) as $criterium) {
    $rule = explode('=', $criterium);
    $rules[$rule[0]] = ($rule[1] == 'Y');
}

var_dump($rules);
// array() {
//     [402]=> bool(true)
//     [7003]=> bool(true)
//     [905]=> bool(true)
//     ...
// }

$isAnyRuleTrue = in_array(true, $rules);

答案 2 :(得分:0)

你可以尝试

if (strpos($record,"OR" )!==FALSE){
    $s = explode("OR",$record);
    foreach ($s as $k){
      #do something with $k
    }
}

答案 3 :(得分:0)

这假定您指定的格式,我假设可能的值将是Y(是)或N(否)


$string = '402=Y OR 7003=Y OR 905=Y OR 7007=Y OR 7008=Y OR 7010=Y OR 7011=Y OR 7013=Y';
$regex = "/\b([\d]+)=([YN])\b/";

if (preg_match_all($regex, $string, $matches)) {
       print_r($matches);
}

Should give you:
Array
(
    [0] => Array
        (
            [0] => 402=Y
            [1] => 7003=Y
            [2] => 905=Y
            [3] => 7007=Y
            [4] => 7008=Y
            [5] => 7010=Y
            [6] => 7011=Y
            [7] => 7013=Y
        )

    [1] => Array
        (
            [0] => 402
            [1] => 7003
            [2] => 905
            [3] => 7007
            [4] => 7008
            [5] => 7010
            [6] => 7011
            [7] => 7013
        )

    [2] => Array
        (
            [0] => Y
            [1] => Y
            [2] => Y
            [3] => Y
            [4] => Y
            [5] => Y
            [6] => Y
            [7] => Y
        )

)

答案 4 :(得分:0)

我首先对字符串运行正则表达式,将“分隔符”更改为“&” - 特别是在“OR”周围可能有额外空格的情况下(在正则表达式中更容易表达,而不是试图单独调整/修剪每个术语。然后使用parse_str()并且你有一个数组,其中每个索引都是问题编号,值为“Y”或“N”。