我想问这个一段时间。 使用 JavaScript 或 PHP 执行正则表达式搜索和替换功能的效率有什么区别?
如果我要开发一个网站,两种语言都可以执行相同的功能,但我只是好奇通常专业的Web开发人员使用什么。
我想知道何时使用JavaScript或PHP的标准,如果两者都可以执行相同的操作。
Javascript var result = str.replace();
PHP preg_replace();
在这种情况下,这实际上不是性能问题,而是您想要在哪里进行替换。如果你想在客户端做一些事情,你可以使用 JavaScript。如果你想在服务器端执行此操作,请使用PHP。
另外:如果你可以选择(比如说,而不是在PHP中进行替换然后回显它,只是在客户端用JavaScript替换),我会使用JavaScript,因为用户的浏览器而不是你的服务器来完成这项工作,因此它会减少服务器负载。但这只有在您每分钟有数千次更换或类似的东西时才重要。
答案很可能不仅仅取决于它的原始性能。例如,让我们假设,如果你将PHP与Javascript结合使用,你可能的意思是说Javascript发生在浏览器端,PHP发生在服务器端。
例如,如果您需要验证电话号码的格式,您可以在提交表单之前(在浏览器中的 Javascript 中)或在 PHP 中的服务器端执行此操作。
假设你在Javascript中做到了,现在当一个没有Javascript的用户过来填写你的表格时会发生什么?或者更有可能是垃圾邮件机器人?格式不正确的数据现在被传递回您的服务器,可能会触发错误或其他意外情况。在此示例中,您可能至少希望验证服务器端的电话号码。但是您可能希望在提交之前能够告诉用户电话号码无效,而不必等待服务器验证它并发回错误,因此在浏览器端的 Javascript 中执行此操作以及服务器端的 PHP 可能是您选择实现它的方式。
我希望这有助于演示在何处实现逻辑的一些注意事项。
一个非常不可靠的基准表明浏览器实际上可能更快。尽管使用我制作的测试用例与我制作的 PHP 用例在浏览器中可能会进行一些非常大的优化。
这篇文章也支持这样的发现:PHP 与 JavaScript 的速度?
在 PHP 中运行此代码:
<?php
require("Logger.php");
$string = "apples and bananas";
$logger = new Logger("Start");
for ($x = 0; $x < 1000000; $x++) {
$newString = str_replace("bananas", "oranges", $string);
}
$logger->log("Finish");
echo $logger->status();
在我的本地机器 (WAMP) 上以 10867ms 返回。(删除我用于日志记录的类不会加快速度。
运行以下 JS 代码 (http://jsfiddle.net/MQKLT/3/) 返回大约 343 毫秒(并且明显更快)。
function go() {
var str = "apples and bananas";
var newString = "";
var d = new Date();
var n = (d.getSeconds() * 1000) + d.getMilliseconds();
for (var x = 0; x < 1000000; x++) {
newString = str.replace("bananas", "oranges");
newString = newString + x;
}
var d2 = new Date();
var n2 = (d2 .getSeconds() * 1000) + d2.getMilliseconds();
//console.log("First: " + n + " Second: " + n2 + " Total: " + (n2 - n));
alert("First: " + n + " Second: " + n2 + " Total: " + (n2 - n) + " Output: " + newString);
}
正如我所说,浏览器可能正在进行一些重大优化。我上面发布的值已在Chrome中进行了测试。我在IE中确实得到了类似的时间,而在Firefox中得到了更快的时间(这对我来说表明优化正在发生。
考虑到这一点:我是一个懒惰的程序员,只要不影响安全性,我倾向于使用对我来说最方便的东西。(IE,关于验证的字符串操作应该在PHP中完成/远离客户端控制)对字符串替换本身执行 AJAX 请求是绝对没有意义的。对于现实世界的情况,它取决于许多变量,例如所涉及的浏览器,涉及的PC,涉及的服务器。
如果您担心字符串替换性能,则用于执行任务的逻辑可能存在问题。