的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.php或http://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";
}
xml/html + regex = [BAD](http://stackoverflow.com/a/1732454/118068)。改用DOM。它也可以让你免于担心换行符。 – 2012-01-07 03:54:15
谢谢,但DOM不能给出完全相同的匹配行为,我无法承担更改。如果不需要100%的后向兼容性,那么我会使用DOM。 – ChrisJJ 2012-01-07 04:27:37
'// meta [@ name ='time']'不够准确? – 2012-01-07 17:15:08