php custom разбирает строку с preg - PullRequest
2 голосов
/ 12 августа 2011

Мои методы анализируют строки и делают вещи с информацией, содержащейся в строке. простой пример будет

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

проблема с вышеуказанным методом заключается в том, что он будет проверять только первый экземпляр;. другое решение, которое я попробовал, было взорвать строку; однако это не сработает, потому что оно взорвалось во всех случаях, включая те, которые были спасены. другая вещь, которую я попробовал, была взрывом с регулярным выражением ниже

/[^\\\];/

Проблема в том, что она взорвалась на персонаже раньше; на всех случаях, которые не были спасены. Есть ли способ, которым я могу взорвать строку во всех случаях; которым не предшествует обратная косая черта?

Ответы [ 3 ]

2 голосов
/ 12 августа 2011

Вместо взрыва вы можете разобрать строку:

$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;
}
2 голосов
/ 12 августа 2011

Рассмотрите возможность использования JSON для вашего формата ввода.Поскольку вы используете PHP, вы можете проверить это введение в JSON и PHP .Также вам нужно будет использовать json_encode () и json_decode () .С помощью этих функций вы можете легко преобразовать строку JSON в объект PHP или ассоциативный массив и обратно при необходимости.Вам не нужно беспокоиться о шаге токенизации / разбора, если вы начинаете с формата, который имеет встроенную справку по разбору.

Если вы хотите использовать XML, тогда вы можете использовать SimpleXML или DOM .Но лучше всего использовать JSON.

0 голосов
/ 12 августа 2011

Написать парсер. Сначала сделайте токенизацию вашего ввода, а затем посмотрите на него.

...