Regex для разделения параметров с помощью preg_match

Я использую это регулярное выражение:

/([-0-9]+).([-0-9]+).([-0-9]+).([-0-9]+).(.*?).([-0-9]).([-0-9]+).([-0-9.]+).([-0-9.]+).([-0-9.]+).*/i

чтобы соответствовать такого рода вещам:

1 0 61 12345678 sierra007^7 0 0 123.123.123.123:524 26429 25000

Проблема, с которой я сталкиваюсь, заключается в том, что имя sierra007^7 действительно выдается как sierr а затем все после того, как оно сломано. Что мне нужно для .*? часть, чтобы соответствовать чему-нибудь, а затем продолжить разделение. Если измените .*? to .* он помещает остальную информацию в тот же параметр.

Может кто-нибудь дать какой-нибудь совет, пожалуйста?

Благодарю.

Может быть, я действительно не понимаю, что вам нужно, но почему бы просто не использовать explode() для разделения вашей строки?

Например, эта часть кода:

 $str = '1 0 61 12345678 sierra007^7 0 0 90.199.42.51:524 26429 25000'; $array = explode(' ', $str); var_dump($array); 

Вы получите:

 array 0 => string '1' (length=1) 1 => string '0' (length=1) 2 => string '61' (length=2) 3 => string '12345678' (length=8) 4 => string 'sierra007^7' (length=11) 5 => string '0' (length=1) 6 => string '0' (length=1) 7 => string '90.199.42.51:524' (length=16) 8 => string '26429' (length=5) 9 => string '25000' (length=5) 

Вместо (.*?) Используйте [^ ]+ это должно быть намного быстрее и работать, как вы делали.

Я знаю, что исходный плакат имеет принятое решение (которое работает очень хорошо), но позвольте мне ответить на конкретный вопрос о том, почему регулярное выражение не работает. Проблема заключается в использовании точки . – и это очень часто ошибочная ошибка. Точка – это шаблон, который редко необходим или уместен. В этом случае точка используется для разделения группы групп цифр. Но данные показывают, что эти поля разделены пробелами. Решение прост; вместо точки, разделите поля пробелами. Также точка используется в форме выражения с ленивой точкой-точкой , что также неуместно в этом случае. Вот как я написал это регулярное выражение (в подробном режиме с комментариями):

 $re = '/ ^ # Anchor to start of line. ([-0-9]+) \s+ # $1: Field 1 ([-0-9]+) \s+ # $2: Field 2 ([-0-9]+) \s+ # $3: Field 3 ([-0-9]+) \s+ # $4: Field 4 (\S+) \s+ # $5: Field 5 ([-0-9]) \s+ # $6: Field 6 ([-0-9]+) \s+ # $7: Field 7 ([-0-9.:]+)\s+ # $8: Field 8 ([-0-9.]+) \s+ # $9: Field 9 ([-0-9.]+) # $10: Field 10 /mx'; 

Это регулярное выражение намного точнее и будет соответствовать (и не соответствовать) намного быстрее в результате.

Другая проблема с исходным регулярным выражением состоит в том, что данные в поле # 8 строки примера содержат двоеточие, которое не указано в восьмом выражении регулярного выражения (т. "sierr" не был единственным полем, которое было неправильно сопоставлено.)

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