PHP preg_match () Неизвестная ошибка - PullRequest
0 голосов
/ 07 сентября 2010

В настоящее время я пытаюсь обработать CSV-файл в PHP с помощью preg_match ().Ниже приведен пример обработки данных, которые я пытаюсь обработать:

, «SN120187», «Aldersr Rd Nr Shops», «», «STHPTN», «50 56.4241N», «1 25.7587.W "," 1001077307 "," 2010-05-30 15:29:49 "," 10 "," "," SURRSHLT3x32 "," BSU243L1 "," iiipiiipiiipiiipiii ",

" HA035028 ","Hursley Road - Госпиталь Ли-Хаус "," "," HURSLEY "," 50 59.6772N "," 1 23.4412W "," "," "," 24 "," "," "," "," Quick brownлиса перепрыгнула через ленивую собаку Быстрая коричневая лиса перепрыгнула через ленивую собаку ",

У меня есть регулярное выражение, которое я пытаюсь использовать на этих данных (ниже);

if(preg_match('/^"(?P<code>.+)","(?P<description>.+)","(?P<bay>.*)","(?P<area>.+)","(?P<lat>.+)","(?P<lon>.+)","(?P<build>.*)","(?P<msgTime>.*)","(?P<routes>.*)","(?P<simNo>.*)","(?P<displayType>.*)","(?P<version>.*)","(?P<comments>.*)",$/', $line, $matches)){}

Регулярное выражение работает на 95% данных, однако данные, которые не работают, имеют последнее поле в строке csv как непустое.

Я начал играть с данными, (в основном последнее поле) и обнаружил, что следующие данные не будут проходить через регулярное выражение:

"SN120187", "Aldersr Rd Nr Shops", "", "STHPTN", "50 54.5512N", "1 22,9273W", "1001077307", "2010-05-30 15:29:49", "10", "", "SURRSHLT3x32", "BSU243L1 "," iiiipiiiipiiiipiiii ",

" HA035028 "," Hursley Road - Leigh House Hospital "," "," HURSLEY "," 52 58.3498N "," 1 26.5421W "," "," ", "24", "", "", "", "iiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipii",

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

Я понятия не имею, что происходитна.У кого-нибудь есть идеи?

В настоящее время я использую PHP версии 5.3.2, и сообщения об ошибках не появляются.

Ответы [ 3 ]

2 голосов
/ 07 сентября 2010

Если это данные CSV, используйте функцию обработки CSV, например str_getcsv для строк или fgetcsv для чтения из файла.

0 голосов
/ 07 сентября 2010

Ответ [^"] в порядке, но я думаю, что вы также можете превратить все ваши операторы + и * в ленивые операторы, сделав их +? и *? соответственно.

preg_match('/^"(?P<code>.+?)","(?P<description>.+?)","(?P<bay>.*?)","(?P<area>.+?)","(?P<lat>.+?)","(?P<lon>.+?)","(?P<build>.*?)","(?P<msgTime>.*?)","(?P<routes>.*?)","(?P<simNo>.*?)","(?P<displayType>.*?)","(?P<version>.*?)","(?P<comments>.*?)",$/', $line, $matches);

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

0 голосов
/ 07 сентября 2010

Я попробовал это локально, и это было так же, как вы описали, у меня есть PHP 5.2.10-2ubuntu6.

Первая попытка , я удалил "(?P<comments>.*)", вашего шаблона:

$line='"HA035028","Hursley Road - Leigh House Hospital","","HURSLEY","52 58.3498N","1 26.5421W","","","24","","","","iiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipii",';

$r=preg_match('/^"(?P<code>.+)","(?P<description>.+)","(?P<bay>.*)","(?P<area>.+)","(?P<lat>.+)","(?P<lon>.+)","(?P<build>.*)","(?P<msgTime>.*)","(?P<routes>.*)","(?P<simNo>.*)","(?P<displayType>.*)","(?P<version>.*)",$/', $line, $matches);

var_dump($r, $matches);

Вывод:

int(1)
array(25) {
  [0]=>
  string(169) ""HA035028","Hursley Road - Leigh House Hospital","","HURSLEY","52 58.3498N","1 26.5421W","","","24","","","","iiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipii","
  ["code"]=>
  string(8) "HA035028"
  [1]=>
  string(8) "HA035028"
  ["description"]=>
  string(35) "Hursley Road - Leigh House Hospital"
  [2]=>
  string(35) "Hursley Road - Leigh House Hospital"
  ["bay"]=>
  string(0) ""
  [3]=>
  string(0) ""
  ["area"]=>
  string(7) "HURSLEY"
  [4]=>
  string(7) "HURSLEY"
  ["lat"]=>
  string(11) "52 58.3498N"
  [5]=>
  string(11) "52 58.3498N"
  ["lon"]=>
  string(13) "1 26.5421W",""
  [6]=>
  string(13) "1 26.5421W",""
  ["build"]=>
  string(0) ""
  [7]=>
  string(0) ""
  ["msgTime"]=>
  string(2) "24"
  [8]=>
  string(2) "24"
  ["routes"]=>
  string(0) ""
  [9]=>
  string(0) ""
  ["simNo"]=>
  string(0) ""
  [10]=>
  string(0) ""
  ["displayType"]=>
  string(0) ""
  [11]=>
  string(0) ""
  ["version"]=>
  string(57) "iiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipii"
  [12]=>
  string(57) "iiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipii"
}

Обратите внимание, что <version> теперь соответствует последнему полю, а <lon> соответствует двум полям


Вторая попытка ;Я заменял каждое . вхождение на [^"]:

$line='"HA035028","Hursley Road - Leigh House Hospital","","HURSLEY","52 58.3498N","1 26.5421W","","","24","","","","iiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipii",';

$r=preg_match('/^"(?P<code>[^"]+)","(?P<description>[^"]+)","(?P<bay>[^"]*)","(?P<area>[^"]+)","(?P<lat>[^"]+)","(?P<lon>[^"]+)","(?P<build>[^"]*)","(?P<msgTime>[^"]*)","(?P<routes>[^"]*)","(?P<simNo>[^"]*)","(?P<displayType>[^"]*)","(?P<version>[^"]*)","(?P<comments>[^"]*)",$/', $line, $matches);

Вывод:

int(1)
array(27) {
  [0]=>
  string(169) ""HA035028","Hursley Road - Leigh House Hospital","","HURSLEY","52 58.3498N","1 26.5421W","","","24","","","","iiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipii","
  ["code"]=>
  string(8) "HA035028"
  [1]=>
  string(8) "HA035028"
  ["description"]=>
  string(35) "Hursley Road - Leigh House Hospital"
  [2]=>
  string(35) "Hursley Road - Leigh House Hospital"
  ["bay"]=>
  string(0) ""
  [3]=>
  string(0) ""
  ["area"]=>
  string(7) "HURSLEY"
  [4]=>
  string(7) "HURSLEY"
  ["lat"]=>
  string(11) "52 58.3498N"
  [5]=>
  string(11) "52 58.3498N"
  ["lon"]=>
  string(10) "1 26.5421W"
  [6]=>
  string(10) "1 26.5421W"
  ["build"]=>
  string(0) ""
  [7]=>
  string(0) ""
  ["msgTime"]=>
  string(0) ""
  [8]=>
  string(0) ""
  ["routes"]=>
  string(2) "24"
  [9]=>
  string(2) "24"
  ["simNo"]=>
  string(0) ""
  [10]=>
  string(0) ""
  ["displayType"]=>
  string(0) ""
  [11]=>
  string(0) ""
  ["version"]=>
  string(0) ""
  [12]=>
  string(0) ""
  ["comments"]=>
  string(57) "iiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipii"
  [13]=>
  string(57) "iiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipiiiipii"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...