Обработка строки в php - PullRequest
1 голос
/ 08 июня 2009

У меня действительно длинная строка в определенном шаблоне, например userAccountName: abc userCompany: xyz userEmail: a@xyz.com userAddress1: userAddress2: userAddress3: userTown: ..... и так далее. Этот шаблон повторяется.

Мне нужно найти способ обработать эту строку, чтобы у меня были значения userAccountName :, userCompany: и т. Д. (Т. Е. Предпочтительно в ассоциативном массиве или в каком-либо таком удобном формате).

Есть ли простой способ сделать это, или мне придется написать собственную логику, чтобы разбить эту строку на разные части?

Ответы [ 7 ]

2 голосов
/ 08 июня 2009

Если вы можете сделать так, чтобы данные форматировались так, как они есть в URL (т. Е. Var = data & var2 = data2), тогда вы можете использовать parse_str, который, я думаю, делает почти точно то, что вы хотите. Некоторое искажение ваших входных данных сделает это простым способом.

2 голосов
/ 08 июня 2009

Простые регулярные выражения, подобные этому userAccountName:\s*(\w+)\s+, можно использовать для захвата совпадений, а затем использовать захваченные совпадения для создания структуры данных.

1 голос
/ 08 июня 2009

Если вы можете написать регулярное выражение (в моем примере я рассматриваю, что в значениях нет точек с запятой), вы можете проанализировать его с помощью preg_split или preg_match_all , например:

<?php

  $raw_data = "userAccountName: abc userCompany: xyz";
  $raw_data .= " userEmail: a@xyz.com userAddress1: userAddress2: ";

  $data = array();
  // /([^:]*\s+)?/ part works because the regexp is "greedy"
  if (preg_match_all('/([a-z0-9_]+):\s+([^:]*\s+)?/i', $raw_data,
                     $items, PREG_SET_ORDER)) {
    foreach ($items as $item) {
      $data[$item[1]] = $item[2];
    }
    print_r($data);
  }

?>

Если это не так, пожалуйста, опишите грамматику вашей строки более подробно.

1 голос
/ 08 июня 2009

Возможно, вам придется использовать регулярное выражение или свою собственную логику.

Гарантируется ли, что строка ":" нигде не появляется внутри самих значений? Если это так, вы можете использовать implode, чтобы разбить строку на массив переменных ключей и значений. Затем вам придется пройти через этот массив и отформатировать его так, как вы хотите. Вот грубый (вероятно, неэффективный) пример, который я быстро собрал:

<?php
$keysAndValuesArray = implode(': ', $dataString);
$firstKeyName = 'userAccountName';
$associativeDataArray = array();
$currentIndex = -1;
$numItems = count($keysAndValuesArray);
for($i=0;$i<$numItems;i+=2) {
    if($keysAndValuesArray[$i] == $firstKeyName) {
         $associativeDataArray[] = array();
         ++$currentIndex;
    }
    $associativeDataArray[$currentIndex][$keysAndValuesArray[$i]] = $keysAndValuesArray[$i+1];
}

var_dump($associativeDataArray);
0 голосов
/ 12 июня 2009

Я думаю, что решение, наиболее близкое к тому, что я искал, я нашел по адресу http://www.justin -cook.com / wp / 2006/03/31 / php-parse-a-string-Между-двумя-строками / . Я надеюсь, что это окажется полезным для кого-то еще. Спасибо всем за все предложенные решения.

0 голосов
/ 08 июня 2009

На вашем месте я постараюсь преобразовать строки в формат json с некоторым регулярным выражением.

Тогда просто используйте Json.

0 голосов
/ 08 июня 2009

PCRE включен в PHP и может отвечать вашим потребностям с помощью регулярных выражений вроде:

if ($c=preg_match_all ("/userAccountName: (<userAccountName>\w+) userCompany: (<userCompany>\w+) userEmail: /", $txt, $matches))
{
  $userAccountName = $matches['userAccountName'];
  $userCompany = $matches['userCompany'];
  // and so on...
}

самое сложное - получить хорошее регулярное выражение для ваших нужд. Вы можете взглянуть на http://txt2re.com для некоторой помощи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...