2

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

$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
    }

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

/[^\\\];/

问题是它之前在字符上爆炸;在所有未逃脱的实例上。有没有办法可以在所有实例上爆炸字符串;前面没有反斜杠?

4

3 回答 3

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;
}
于 2011-08-11T22:44:29.860 回答
2

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

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

于 2011-08-11T23:11:12.233 回答
0

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

于 2011-08-11T22:39:35.870 回答