2016-11-13 257 views
2

我碰到这行代码来:正则表达式忽略换行字符

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

的Content-Type:multipart/alternative的; 边界= f403045e21e067188c05413187fd \ r \ n

它返回

f403045e21e067188c05413187fd \ r

当它应该返回

f403045e21e067188c05413187fd

(无\r

任何想法如何解决这个问题?

PS:还应该为表达式工作时\r不存在时,仅\n

+0

是'\ r'和'\ n'文字还是换行符? – chris85

回答

2

有两种选择。

  1. 使用懒惰点匹配和添加可选\r

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

参见this PHP demo

  • 使用[^\r\n]否定的字符类匹配任何字符,但\r\n

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

  • 或者,更短的版本,使用\V速记字符类匹配不是垂直空白(未断行字符)任何字符:

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

    thisthis 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

    没有工作,谢谢 –