【问题标题】:Weird problem in exploding string with newline用换行符爆炸字符串的奇怪问题
【发布时间】:2011-06-03 11:00:06
【问题描述】:

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

$sql = "创建表测试 ( id mediumint(9) unsigned NOT NULL auto_increment, 文件名文本不为空, 元长文本, added_date datetime NOT NULL default '0000-00-00 00:00:00', 主键(id) )"; var_export(explode("\n",$sql));

上面的代码基本上是用换行符('\n')分解$sql中的字符串,然后使用var_export输出。我有一些 PHP 测试文件可以处理代码,但并不是所有的测试文件都显示了我希望的结果:

array ( 0 => '创建表测试 (',
        1 => ' id mediumint(9) unsigned NOT NULL auto_increment, ',
        2 => ' 文件名文本 NOT NULL, ',
        3 => '元长文本,',
        4 => ' added_date datetime NOT NULL default \'0000-00-00 00:00:00\', ',
        5 => '主键 (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) ) ;', )

注意到区别了吗?第二个显示它,因为没有换行符来爆炸字符串。我不明白这里发生了什么。有人知道吗?

【问题讨论】:

  • 您的编辑器可能使用了\r 而不是\n
  • 如果这是在 Windows 系统上,它可能是回车 \r,或者如果您在网页中查看结果,它可能是 html
  • 是的,我认为这就是问题所在,但奇怪的是有几个 PHP 像我希望的那样工作,但其余的却不是,最奇怪的是测试文件都在同一个目录中。

标签: php explode


【解决方案1】:

您需要灵活处理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

【讨论】:

  • 你有多么棒的解决方案。非常感谢。
【解决方案2】:

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

【讨论】:

  • 是的,它也在同一台计算机和同一目录中。是的,它与 \r 配合得很好。我只知道它实际上取决于操作系统。非常感谢,为了解决这个问题,我将使用上面的 Álvaro 方法。
猜你喜欢
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 2020-12-10
相关资源
最近更新 更多