用换行符爆炸字符串的奇怪问题

时间:2011-01-04 14:59:58

标签: php explode

我不知道这个PHP代码有什么问题:

$sql = "CREATE TABLE test (
 id mediumint(9) unsigned NOT NULL auto_increment,
 filenames text NOT NULL,
 meta longtext,
 added_date datetime NOT NULL default '0000-00-00 00:00:00',
 PRIMARY KEY  (id)
)";
var_export(explode("\n",$sql));

上面的代码基本上使用换行符char('\ n')爆炸$ sql中的字符串,然后使用var_export输出它。我有一些PHP测试文件来处理代码,但并不是所有这些都显示了我希望的内容:

array ( 0 => 'CREATE TABLE test ( ', 
        1 => ' id mediumint(9) unsigned NOT NULL auto_increment, ', 
        2 => ' filenames text NOT NULL, ', 
        3 => ' meta longtext, ', 
        4 => ' added_date datetime NOT NULL default \'0000-00-00 00:00:00\', ', 
        5 => ' PRIMARY KEY (id) ', 6 => ') ;', 
)

反而将这一点改为:

array ( 0 => 'CREATE TABLE test ( id mediumint(9) unsigned NOT NULL auto_increment, filenames text NOT NULL, meta longtext, added_date datetime NOT NULL default \'0000-00-00 00:00:00\', PRIMARY KEY (id) ) ;', )

注意区别?第二个显示它,因为没有新行来爆炸字符串。我不知道这里发生了什么。任何人都知道一些事情吗?

2 个答案:

答案 0 :(得分:3)

您需要灵活处理line feed的样子。你可以进行灵活的爆炸:

preg_split("/[\r\n]+/", $sql)

...或者您可以将换行符规范化为您选择的格式:

$sql = strtr($sql, array(
    "\r\n" => "\n",
    "\r" => "\n",
));
explode("\n",$sql)

值得注意的是,MySQL提供了几个SHOW语句,允许您从表定义中获取最有用的数据。通常不需要解析SHOW CREATE TABLE输出:

http://dev.mysql.com/doc/refman/5.1/en/show.html

答案 1 :(得分:1)

是否在同一台计算机上创建了所有页面?对于不同的操作系统,行结束字符代码是不同的。它可以是以下之一:\n\r\r\n,具体取决于系统是Windows,Mac还是* nix。您可能想要检查这三个。