【问题标题】:Splitting a string up into parts将字符串分成几部分
【发布时间】:2009-07-27 02:19:49
【问题描述】:

我在表格中有一个问题列表,其中一些问题只有在满足某些条件时才会显示。一条记录可能具有像 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(),但收效甚微。

任何指针将不胜感激。

【问题讨论】:

  • 如果我正确理解您的问题,您想要进行嵌套拆分。外部指定 ' OR ' 作为分隔符。使用'='作为内部的。我也会尝试从设计中重构出神奇的数字。

标签: php string extract


【解决方案1】:

如果你的输入字符串真的只是一堆用“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),那么您将需要一个相应更智能的解析器。

【讨论】:

  • 谢谢,我们里面确实有一些 AND,但我正在查看一些东西以确保它们没有混合在一起。如果所有问题都只包含 OR 或 AND,我会没事的
【解决方案2】:
$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);

【讨论】:

    【解决方案3】:

    你可以试试

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        这假设您指定的格式,我假设可能的值将是 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
                )
        
        )
        
        

        【讨论】:

        • 我尝试了上述方法,但我没有从 print_r($matches);我只是错过了什么吗? (或者我很密集?)
        • 刚刚编辑添加了您应该从 print_r 获得的结果。所以你不明白吗?即使您直接复制并粘贴该代码?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-30
        • 2013-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多