php使用preg自定义解析字符串

php使用preg自定义解析字符串,php,string,parsing,explode,preg-split,Php,String,Parsing,Explode,Preg Split,我的方法解析字符串并处理字符串中包含的信息。 一个简单的例子是 $string= " user:name,password={$_POST['name']}, {$_POST['password']}(md5); names:name=name; "; $class->$method($string); 上面将执行两个insert语句。第一个将在名为user的表中插入md5中包含的用户名和密码 第二个将在names表中插入一个名称。我正在设置它以便可以转义字符。即如果用

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

$string=
"
    user:name,password={$_POST['name']}, {$_POST['password']}(md5); 
    names:name=name;
";
$class->$method($string);
上面将执行两个insert语句。第一个将在名为user的表中插入md5中包含的用户名和密码
第二个将在names表中插入一个名称。我正在设置它以便可以转义字符。即如果用户名是p;简单这根绳子应该是p;ez.
我目前的方法如下

    #get position of ;
    $offsetSemi=stripos($s, ";");
    #check if its escaped
    if ($s[$offsetSemi-1]!='\\')
    {
        //not escaped
    }
上述方法的问题在于,它只会检查;的第一个实例;。 我试过的另一个解决方案是把绳子断开;。但是,这不起作用,因为它在所有实例(包括转义的实例)上都会爆炸。我尝试的另一件事是使用下面的正则表达式进行爆炸

/[^\\\];/

这个问题的症结在于它以前在charecter上爆炸过;在所有未转义的实例上。是否有一种方法可以在所有实例上分解字符串;如果前面没有反斜杠,请编写解析器。首先标记您的输入,然后查看它。

您可以解析字符串,而不是分解:

$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;
}
$arr=array();
$tmp=“”;
对于($i=0;$i0{//最后一节
$arr[]=$tmp;
}

考虑对输入格式使用JSON。因为您使用的是PHP,所以您可以查看这个。此外,您还需要使用和。使用这些函数,您可以轻松地将JSON字符串转换为PHP对象或关联数组,并在需要时再次转换。如果您从内置解析帮助的格式开始,则无需担心标记化/解析步骤


如果您想使用XML,那么可以使用或。但是,最好使用JSON。

您的输入必须采用这种复杂的格式吗?如果不是,您应该考虑使用在XMLXJL上构建的解析器(如JSON)的格式。我不熟悉json或xml。我听说过它们,但从未学习过或使用过它们。您能推荐一个包含解析xml或json示例的页面吗?除了最后一部分外,其余部分都存储。@yamikoWebs:显然
$tmp
包含
for
循环后的最后一部分。无论如何,我编辑了我的答案,将最后一部分包含在
$arr
中。