【问题标题】:preg_replace vs ereg_replace vs str_replace On This Particular Casepreg_replace vs ereg_replace vs str_replace 在这个特殊情况下
【发布时间】:2021-01-31 03:24:21
【问题描述】:

使用 PHP,我想生成自定义 MySQL 转储文件(由于无法使用 exec 和其他一些原因)。

我找到了这两个类似的解决方案:

  1. https://www.kvcodes.com/2017/10/php-create-mysql-backup
  2. https://davidwalsh.name/backup-mysql-database-php

我要强调的不同部分是:

链接 1:

$row[$j] = preg_replace("#\n#", "\\n", $row[$j])

链接 2:

$row[$j] = ereg_replace("\n","\\n",$row[$j])

我知道 ereg_replace() 已被弃用。我还假设解决方案 Link 1 中有错字,应该是:

$row[$j] = preg_replace("\n", "\\n", $row[$j])

但是在我的解决方案中,我只是使用:

$row[$j] = str_replace("\n", "\\n", $row[$j])

使用str_replace()? 我怎么会出错?我已经测试了转储几个复杂数据(json、编码、html 语法),一切似乎都很好。 str_replace() 的处理方式是否与 preg_replace() 不同?

【问题讨论】:

  • 链接1中没有错别字。看你需要分隔符的手册。 \v 可能是正则表达式中任何换行符的最佳选择。
  • 我在大部分项目中都使用了 str_replace()。 (完全没问题)
  • ereg_replace() 在 PHP7 中被删除。如果您仍在使用具有它的 PHP 版本,您应该做的第一件事是将其升级到 PHP8
  • @user3783243,不是拼写错误意味着他想删除所有评论?但不应该是"#*.#"吗?
  • 不,这是用转义的换行符替换所有换行符。 #s 是分隔符,不是正则表达式的一部分。 php.net/manual/en/regexp.reference.delimiters.php

标签: php mysql escaping mysql-real-escape-string


【解决方案1】:

来自the manual

如果你不需要花哨的替换规则(比如正则表达式),你应该使用这个函数而不是 preg_replace()。

如果str_replace() 满足您的需求,请使用它。它会比preg_replace() 更快。

简单的字符串替换不如正则表达式智能,因此请为您的应用程序彻底测试。

【讨论】:

  • 这就是我害怕的原因。万一我的测试不是很彻底。但是考虑到要替换的简单模式 (\n),我可以坚持 str_replace 对吗?或者通过使用正则表达式,它也可以满足不同平台的情况?任何东西
  • \n 不是 Windows 中的新行。如果您需要转义每个新行而不考虑平台,则应该使用正则表达式。
  • @user3783243 感谢您的澄清。所以我将我的解决方案更改为$row[$j] = preg_replace("\n", "\\n", $row[$j]),以便在任何平台上都安全
  • @Coisox 使用\v 表示在任何平台上应该是换行符的任何垂直空格。同样,尽管您 需要 分隔符。
猜你喜欢
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
相关资源
最近更新 更多