2012-01-07 60 views
0

此代码在Linux上工作结束,但未能匹配的Windows:PHP预浸料与线在Linux和Windows

if (preg_match ("~<meta name='date' content='(.*)'>\n<meta name='time' content='(.*)'>\n<meta name='venue' content='(.*)'>\n~", file_get_contents($filename), $matches)) 
... 

我猜行结束编码是错误的。我应该如何修改模式为 结束编码独立?

+0

xml/html + regex = [BAD](http://stackoverflow.com/a/1732454/118068)。改用DOM。它也可以让你免于担心换行符。 – 2012-01-07 03:54:15

+0

谢谢,但DOM不能给出完全相同的匹配行为,我无法承担更改。如果不需要100%的后向兼容性,那么我会使用DOM。 – ChrisJJ 2012-01-07 04:27:37

+0

'// meta [@ name ='time']'不够准确? – 2012-01-07 17:15:08

回答

1

的Windows行尾:

"\r\n" 

最简单的解决方法是:

if (preg_match ("~<meta name='date' content='(.*)'>\n<meta name='time' content='(.*)'>\n<meta name='venue' content='(.*)'>\n~", file_get_contents($filename), $matches) 
    || 
    preg_match("~<meta name='date' content='(.*)'>\r\n<meta name='time' content='(.*)'>\r\n<meta name='venue' content='(.*)'>\r\n~", file_get_contents($filename), $matches)) 

正确的解决方案可能是:

if (preg_match("~<meta name='date' content='(.*)'>[\r]?\n<meta name='time' content='(.*)'>[\r]?\n<meta name='venue' content='(.*)'>[\r]?\n~", file_get_contents($filename), $matches)) 

也就是说,你可能真的应该使用另一种方法来处理XML & XML。有专门为此构建的解析器。

例如http://docs.php.net/manual/en/domdocument.loadhtml.phphttp://php.net/manual/en/book.xml.php

在一个侧面说明,我没有真正测试过,但iirc,他们的工作。正则表达式不是我用得很多的东西。

编辑: 看起来工作得很好?

$file = "iorahgjajgasjgasjgasjgjaagaspokadsfgals<meta name='date' content='(.*)'>\n<meta name='time' content='(.*)'>\n<meta name='venue' content='(.*)'>\niorahgjajgasjgasjgasjgjaagaspokadsfgals"; 

if (preg_match("~<meta name='date' content='(.*)'>\n<meta name='time' content='(.*)'>\n<meta name='venue' content='(.*)'>\n~", $file, $matches) 
    || preg_match ("~<meta name='date' content='(.*)'>\r\n<meta name='time' content='(.*)'>\r\n<meta name='venue' content='(.*)'>\r\n~", file, $matches)) { 
    echo "Success"; 
} 
else { 
    echo "Fail"; 
} 

$file = "iorahgjajgasjgasjgasjgjaagaspokadsfgals<meta name='date' content='(.*)'>\r\n<meta name='time' content='(.*)'>\n<meta name='venue' content='(.*)'>\r\niorahgjajgasjgasjgasjgjaagaspokadsfgals"; 

if (preg_match ("~<meta name='date' content='(.*)'>[\r]?\n<meta name='time' content='(.*)'>[\r]?\n<meta name='venue' content='(.*)'>[\r]?\n~", $file, $matches)) { 
    echo "Success"; 
} 
else { 
    echo "Fail"; 
}  
+0

谢谢,但都在这里失败。是否有一些解决方案使用多行和^ $? – ChrisJJ 2012-01-07 04:21:41

+0

你确定吗?你可以显示你的文件内容和你试图匹配的地方是什么? – ReadWriteCode 2012-01-07 04:32:05

+0

我的错误 - 都成功了。谢谢你的好回答。 – ChrisJJ 2012-01-07 12:49:53