двоичный файл — сбой preg_match

Может кто-нибудь сказать мне, почему следующий поиск preg_match работает:

preg_match("/\xF0\x49\xF7\xF8..\xF3\xF8/s", $bin, $matches2, PREG_OFFSET_CAPTURE);

пока это не даст никакого результата:

preg_match("/\x3F.\x0D\x01\x3E.\xF3\xFA..\x43\xFA.\x04\xFD\x02/s", $bin, $matches, PREG_OFFSET_CAPTURE);

Обе возможности находятся внутри $ bin.

Дальнейший вопрос:

Каков наилучший способ поиска следующих позиций, где XX — переменные и могут быть чем угодно (1 совпадение или больше) в файле $ bin, по крайней мере, мне нужна начальная позиция каждого совпадения.

Мне нужно искать это:

3F XX 0D 01 3E XX F3 FA XX XX 43 FA XX 04 FD 02

Пример совпадения:

**4 example matches**
1) 3F 64 0D 01 3E 64 F3 FA 86 F8 43 FA E1 04 FD 02
2) 3F 5C 0D 01 3E 5C F3 FA 9C F8 43 FA B6 04 FD 02
3) 3F 5B 0D 01 3E 5B F3 FA 9A F8 43 FA 69 04 FD 02
4) 3F 6B 0D 01 3E 6B F3 FA 78 F8 43 FA 38 04 FD 02

Я могу искать в файле $ bin, где $ bin содержит необработанный двоичный файл, или конвертировать его как bin2hex ($ bin), ..

Я узнал об этом сейчас, и, похоже, это работает, но действительно ли это «хороший» и быстрый способ сделать это? В моем скрипте уже выделено более 300 МБ ОЗУ, и я хочу, чтобы он был немного более дружественным к ресурсам.

preg_match_all("/3F[A-Z0-9]{2}0D013E[A-Z0-9]{2}F3FA[A-Z0-9]{4}43FA[A-Z0-9]{2}04FD02/", $binhex, $matches, PREG_OFFSET_CAPTURE);

1

Решение

Вашему последнему регулярному выражению не хватало нескольких пробелов и {4} группа не собиралась соответствовать вашим образцам. Исправлено, это выглядит так:
3F [A-F\d]{2} 0D 01 3E [A-F\d]{2} F3 FA [A-F\d]{2} [A-F\d]{2} 43 FA [A-F\d]{2} 04 FD 02 Это работает в 172steps что нечего разочаровывать.

При выборе правильного шаблона регулярных выражений для вашего проекта, лучше всего определить ваши приоритеты по:

  1. Краткость картины & читабельность — больше беспокойства, если вы работаете в команде или часто обновляетесь.

  2. Скорость шаблона / Шаги — безусловно, проблема при работе с большими объемами данных.

  3. Сила проверки шаблона — это ответственность разработчика, чтобы понять, что необходимо.

Давайте рассмотрим несколько вариантов, которые я подготовил (есть и другие, регулярное выражение — кроличья нора).

(?:.. ?){16}
272steps: это отдает предпочтение краткости шаблона при больших затратах на силу и скорость проверки

(?:[A-F\d]{2} ?){16}
208steps: это отдает приоритет краткости, с немного улучшенной проверкой и скоростью

3F \d[A-F\d] 0D 01 3E \d[A-F\d] F3 FA \d[A-F\d] F8 43 FA [A-F\d]\d 04 FD 02
192steps: это очень буквально и определяет приоритеты валидации с затратами на длину и скорость паттерна

3F [A-F\d]{2} 0D 01 3E [A-F\d]{2} F3 FA [A-F\d]{2} [A-F\d]{2} 43 FA [A-F\d]{2} 04 FD 02
172steps: квантификатор {2} увеличивает скорость, но с небольшим влиянием на проверку, потому что расширенный символ находится в каждой паре

[A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} [A-F\d]{2} 135steps: это самый большой разумный компромисс, когда приоритеты в скорости, краткости и силе проверки в значительной степени затронуты

[A-F\d ]{47} 12steps: _Если валидация нужна только для защиты от вредоносных строк, а не для проверки качества строк, это может быть полезно.

Опять же, если ваш спрос на валидацию такой низкий, то, возможно, избегайте затрат на regex/preg_match_all все вместе. Возможно использовать str_split($str,49) или похожие.

Таким образом, решение остается за вами, но лучше всего сравнить несколько вариантов.

Всякий раз, когда у вас есть вопросы или сомнения по поводу шаблона регулярных выражений, отправляйтесь на regex101.com добавьте несколько примеров данных и поиграйтесь с несколькими шаблонами регулярных выражений. Страница покажет вам ошибки, шаги / скорость и захваченные данные — это очень удобно.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]