2012-01-07 4 views
0

で終わる:PHPのプリプレグ試合は、このコードはLinux上で動作しますが、Windows上で一致しない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 +正規表現= [BAD](http://stackoverflow.com/a/1732454/118068)。代わりにDOMを使用してください。改行文字を心配することもなくなります。 –

+0

ありがとうございますが、DOMはまったく同じ動作をすることはできませんし、私は変更する余裕がありません。 100%の後方互換性が必要ない場合は、私はDOMを使用します。 – ChrisJJ

+0

'// meta [@ name = 'time']'は十分正確ではありませんか? –

答えて

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)) 

つまり、の場合、おそらくHTML & 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"; 
}  
+0

ありがとうございますが、どちらも失敗します。複数行と^ $を使用したソリューションがありますか? – ChrisJJ

+0

本当ですか?あなたのファイルの内容を表示することができますし、あなたが照合しようとしている場所は何ですか? – ReadWriteCode

+0

私の間違い - どちらも成功する。良い答えをありがとう。 – ChrisJJ

関連する問題