2016-11-13 9 views
2

Я наткнулся на эту строку кода:Regex - игнорировать символы новой строки

preg_match_all("!boundary=(.*)$!mi", $content, $matches); 

но

Content-Type: многочастному/альтернатива; граница = f403045e21e067188c05413187fd \ г \ п

возвращает

f403045e21e067188c05413187fd \ г

Когда он должен вернуть

f403045e21e067188c05413187fd

(без \r)

Любые идеи, как исправить это?

PS .: Он должен также работать, когда \r нет, только \n

+0

Являются ли '\ r' и' \ n' буквальными или новыми символами строки? – chris85

ответ

2

Существует два варианта.

  1. использование ленивым соответствие точек и добавить дополнительный \r:

    preg_match_all("!boundary=(.*?)\r?$!mi", $content, $matches);

См this PHP demo

  1. использовать [^\r\n] отрицание характера класс, соответствующий любому символу, но \r и \n:

    preg_match_all("!boundary=([^\n\r]*)!mi", $content, $matches);

Или сокращенный вариант, используя сокращенную класс символов \V соответствует любому символу, который не является вертикальным пробельные (не LINEBREAK символов):

preg_match_all("!boundary=(\V*)!mi", $content, $matches); 

См this или this PHP demo.

Примечание, что второй подход намного эффективнее.

+2

Использование '\ V' также должно работать для второго случая. –

+1

Правильно, я все еще проверял шаблоны и останавливался только на '\ N'. '\ V' также работает. –

+0

первый работал хорошо, не пытался второй. благодаря! –

0

Измените выражение

preg_match_all("!boundary=(.*)\\r?$!mi", $content, $matches); 

Это должно вычистить \ г, если таковой существует.

Отредактировано: \ r нуждается в экранировании в RegExp.

+0

Это решение [не работает] (http://ideone.com/K70iQ4), поскольку возврат каретки все еще существует. –

+0

не работает, спасибо –