最有效的 PHP str_replace数组,如果行只有 5% 的机会包含目标


Most efficient PHP str_replace on array if row only has 5% chance of containing target?

我有一个 15,000 行的 PHP 数组。我需要遍历每一行以生成一个 15,000 行的 Javascript 数组。PHP 数组的每一行都有 5% 的机会包含一个或多个 HTML 特殊字符,例如我需要用等效的 JavaScript 十六进制替换的 ó。我必须注意和替换大约 50 个 HTML 特殊字符,所以我会使用 str_replace(array_of_HTML_targets, array_of_hex_replacements, haystack) .以下做法是否更有效:

  1. 遍历 PHP 数组的每一行,搜索一个 & 符号,如果存在,则进行搜索和替换(考虑到这仅适用于 5% 的行)
  2. 对整个阵列执行搜索和替换
  3. 将数组连接成一个巨大的字符串,并在巨型字符串上执行搜索和替换
  4. 其他想法?请具体说明

顺便说一句,15,000 PHP数组的原因是这是一个数据可视化应用程序。

由于您已经需要将 PHP 数据转储到字符串(可能是 JSON)中,因此您不妨处理最终字符串,如下所示:

$json = json_encode($your_php_array);
$unhtmlref = preg_replace_callback("/&#(x[0-9a-f]+|'d+);/",function($m) {
    if( $m[1][0] == "x") $m[1] = substr($m[1],1);
    else $m[1] = dechex($m[1]);
    return sprintf("''u%04s",$m[1]);
},$json);

这是安全的,因为 HTML 字符代码在 JSON 字符串中没有任何特殊含义。

也就是说,我的JavaScript"实用带"中有一个函数可以做类似的事情:

function unHTMLref(str) {
    // take a string and return it, with all HTML character codes parsed
    var div = document.createElement('div');
    div.innerHTML = str.replace(/</g,"&lt;");
    return div.firstChild.nodeValue;
}

所以基本上你可以在之前或之后解析。就个人而言,我更喜欢"之后",因为它将一些"繁重"的工作转移到浏览器上,允许服务器做更重要的事情。