php自定义用preg解析一个字符串

时间:2011-08-11 22:31:54

标签: php string parsing explode preg-split

我的方法解析字符串并使用字符串中包含的信息进行处理。 一个简单的例子就是

$string=
"
    user:name,password={$_POST['name']}, {$_POST['password']}(md5); 
    names:name=name;
";
$class->$method($string);

上面会做两个插入语句。第一个将在名为user的表中插入用户名和密码在md5中加密。
第二个会在名称表中插入一个名称。我正在设置它以便可以转义字符。即如果用户名是p; ez。该字符串将具有p \; ez。
我目前的方法如下

    #get position of ;
    $offsetSemi=stripos($s, ";");
    #check if its escaped
    if ($s[$offsetSemi-1]!='\\')
    {
        //not escaped
    }

上述方法的问题在于它只检查第一个实例;。 我尝试的另一个解决方案是爆炸字符串;但这不起作用,因为它在所有实例上爆炸,包括被转义的实例。我试过的另一件事是用下面的正则表达式爆炸

/[^\\\];/
与此相关的问题是它之前在charecter上爆炸了;在所有未转义的实例上。有没有办法可以在所有实例上爆炸一个字符串;没有反斜杠的前面?

3 个答案:

答案 0 :(得分:2)

您可以解析字符串而不是爆炸:

$arr = array();
$tmp = "";

for ($i = 0; $i < strlen($s); $i++) {
   switch ($s[$i]) {
      case "\\":
         if ($i < strlen($s) - 1) $tmp .= $s[$i++] . $s[$i++];
      break;
      case ";":
         $arr[] = $tmp;
         $tmp = "";
      break;
      default:
         $tmp .= $s[$i];
   }
}

if (strlen(trim($tmp)) > 0) { // last section
    $arr[] = $tmp;
}

答案 1 :(得分:2)

考虑使用JSON作为输入格式。由于您使用的是PHP,因此可以查看此intro to JSON and PHP。此外,您还需要使用json_encode()json_decode()。使用这些函数,您可以轻松地将JSON字符串转换为PHP对象或关联数组,并在需要时再将其转换回来。如果您使用内置解析帮助的格式开始,则无需担心标记化/解析步骤。

如果您想使用XML,则可以使用SimpleXMLDOM。但是,使用JSON最适合您。

答案 2 :(得分:0)

编写解析器。首先对您的输入进行标记,然后查看它。