【问题标题】:Data Not Being Parsed Correctly数据未正确解析
【发布时间】:2013-11-11 17:14:50
【问题描述】:

我有一个简单的数据格式,如下所示:

stuff/stuff/stuff

一个例子是:

data/test/hello/hello2

为了检索某条数据,可以使用我的解析器,它会尝试执行以下操作:

data/test/hello/hello2

您要检索data/test(即hello)下的数据。我的解析器代码如下:

function getData($data, $pattern)
{
    $info = false;

    $dataLineArray = explode("\n", $data);

    foreach($dataLineArray as &$line)
    {
        if (strpos($line,$pattern) !== false) {

            $lineArray = explode("/", $line);
            $patternArray = explode("/", $pattern);

            $iteration = 0;


            foreach($lineArray as &$lineData)
            {
                if($patternArray[$iteration] == $lineData)
                {
                    $iteration++;
                }
                else
                {
                    $info = $lineData;
                }
            }


        }
    }

    return $info;
}

但是,它似乎总是返回最后一项,在这种情况下是hello2

echo getData("data/test/hello/hello2", "data/test");

给我;

hello2

我做错了什么?

【问题讨论】:

  • 您只想要“你好”部分吗?如果没有换行符,你为什么要在换行符上爆炸$data
  • 是的。之后就什么都没有了。
  • 您每次通过循环设置$info。循环完成后,它将包含上次设置时的分配。
  • 人们在不需要时使用正则表达式,在需要时忽略。基本上,data/test/(\w+) 是您正在寻找的模式:gskinner.com/RegExr

标签: php string parsing


【解决方案1】:

如果你想要模式后面的第一个元素,请将break 放入循环中:

        foreach($lineArray as $lineData)
        {
            if($patternArray[$iteration] == $lineData)
            {
                $iteration++;
            }
            elseif ($iteration == count($patternArray))
            {
                $info = $lineData;
                break;
            }
        }

我还检查了$iteration == count($patternArray),这样它就不会返回中间元素,例如

/data/foo/test/hello/hello2

将返回 hello 而不是 foo

附:似乎没有任何理由在循环中使用引用而不是普通变量,因为您从不分配给引用变量。

【讨论】:

  • OP 只想要模式之后的第一个元素。
  • 我已经修改了我的答案,我认为它更符合 OP 的需求。
猜你喜欢
  • 2016-11-25
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多