Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
提高批量JavaScript替换的效率_Javascript_Regex - Fatal编程技术网

提高批量JavaScript替换的效率

提高批量JavaScript替换的效率,javascript,regex,Javascript,Regex,在我的博客中,我有一些用相应图像替换笑脸符号的JavaScript。 因此,像:)或:(这样的符号被适当的标记所取代 目前大约有50个笑脸符号可以使用,但在任何一个页面中,显然只会使用其中的几个。 脚本中有元素形式的行。为每个笑脸替换(smileyRegex,)。 问题是,由于这些正则表达式匹配行的数量很大,脚本在加载页面后会导致轻微延迟 我正在考虑以下方法来提高效率:使用匹配所有笑脸符号的大型正则表达式作为第一个参数调用replace,并使用从数组中选择适当图像作为第二个参数的函数调用。 这种

在我的博客中,我有一些用相应图像替换笑脸符号的JavaScript。
因此,像
:)
:(
这样的符号被适当的
标记所取代

目前大约有50个笑脸符号可以使用,但在任何一个页面中,显然只会使用其中的几个。 脚本中有
元素形式的行。为每个笑脸替换(smileyRegex,)
。 问题是,由于这些正则表达式匹配行的数量很大,脚本在加载页面后会导致轻微延迟

我正在考虑以下方法来提高效率:使用匹配所有笑脸符号的大型正则表达式作为第一个参数调用
replace
,并使用从数组中选择适当图像作为第二个参数的函数调用。
这种用法会比一些单独的
替换
调用更有效吗?

几乎任何“哪种更有效”的问题都会得到类似“视情况而定”的答案。你的建议听起来肯定很有希望,但你真的应该在几个不同的浏览器上进行基准测试,并确保这一点

另一种解决方案是按原样呈现页面,然后异步遍历50个smiley中的每一个,一次运行一个regexp。这肯定会花费更多的时间,但用户不会感觉到延迟(因为页面已经呈现)。

几乎任何“哪个更有效”的问题都会得到这样的答案“视情况而定”。你的建议听起来很有希望,但你真的应该在几个不同的浏览器上进行基准测试,并确保


另一种解决方案是按原样呈现页面,然后异步遍历50个smiley中的每一个,并一次运行一个regexp。这肯定会花费更多的时间,但用户不会感觉到延迟(因为页面已经呈现).

让一个正则表达式匹配所有出现的笑脸将更加有效。这是因为它只会在源代码中进行一次迭代,而不是每个笑脸进行一次迭代。然后使用笑脸->img src创建一个适当的哈希表/对象将是一个有效的查找:

var smileyImgMap = {
    ":)" : "happysmiley.png",
    ":(" : "sadsmiley.png"
};
然后像这样使用它:

var smileyImg = smileyImgMap[":)"];
var replaceLookup = {aa: "--", bb: "++", cc: "**"};
var result = sourceStr.replace(/aa|bb|cc/g, function(str, p1, p2, offset, s)   
{
    return(replaceLookup[str]);
});

我想你明白了。

让一个正则表达式匹配所有出现的smiley会更有效率。这是因为它只会在源代码中进行一次迭代,而不是每个smiley进行一次迭代。然后使用smiley->img src创建一个适当的哈希表/对象将是一个高效的查找:

var smileyImgMap = {
    ":)" : "happysmiley.png",
    ":(" : "sadsmiley.png"
};
然后像这样使用它:

var smileyImg = smileyImgMap[":)"];
var replaceLookup = {aa: "--", bb: "++", cc: "**"};
var result = sourceStr.replace(/aa|bb|cc/g, function(str, p1, p2, offset, s)   
{
    return(replaceLookup[str]);
});
我想你明白了。

我写这篇文章是为了测试这两个概念。它可能需要更具代表性的数据,用于搜索哪种类型的源数据、查找多少不同的内容以及找到匹配项的频率。你可以将这些数据填入jsperf的基本框架中,然后查看它在不同的浏览器中

regex w/callback选项基本上如下所示:

var smileyImg = smileyImgMap[":)"];
var replaceLookup = {aa: "--", bb: "++", cc: "**"};
var result = sourceStr.replace(/aa|bb|cc/g, function(str, p1, p2, offset, s)   
{
    return(replaceLookup[str]);
});
我写这篇文章是为了测试这两个概念。它可能需要更具代表性的数据放入其中,以确定您正在搜索的源数据类型、查找的不同内容以及找到匹配项的频率。您可以将这些数据填入jsperf的基本框架中,然后在不同的浏览器中查看

regex w/callback选项基本上如下所示:

var smileyImg = smileyImgMap[":)"];
var replaceLookup = {aa: "--", bb: "++", cc: "**"};
var result = sourceStr.replace(/aa|bb|cc/g, function(str, p1, p2, offset, s)   
{
    return(replaceLookup[str]);
});

加速的一种方法是将所有笑脸放在一个图像中,并将其用作一个标记

在css文件中指定笑脸的图像位置,然后使用@jishi建议的哈希映射来映射对应笑脸的css样式

var smileyClassMap = {
  ":)" : "smily1",
  ":(" : "smily2",
  ":P" : "smily3"
};

将文本笑脸替换为
标记或类似标记

加快速度的一种方法是将所有笑脸放在一个图像中,并将其用作标记

在css文件中指定笑脸的图像位置,然后使用@jishi建议的哈希映射来映射对应笑脸的css样式

var smileyClassMap = {
  ":)" : "smily1",
  ":(" : "smily2",
  ":P" : "smily3"
};

将文本笑脸替换为
标记或类似标记

编写您自己的测试并在一些流行浏览器中查看。答案可能是显而易见的,也可能没有单一的正确答案。编写您自己的测试并在一些流行浏览器中查看。答案可能是显而易见的,也可能没有单一的正确答案。作为值得注意的是,您运行的替换次数越多,差异就越大。当您对大量文本进行大量替换时,会有明显的延迟,有时浏览器甚至会冻结。但单个正则表达式方法的工作延迟几乎为零。值得注意的是,您运行的替换次数越多,延迟越大e差异会变得更大。当你在大量文本上进行大量替换时,会有明显的延迟,有时浏览器甚至会冻结。但是单一正则表达式方法的工作延迟几乎为零。你是对的!使用单一正则表达式产生了很大的差异。现在,笑脸替换很容易发生。笑脸有了工作ds和常见字符在其表示中,单个正则表达式的长度约为200。但仍然值得努力:)你说得对!使用一个正则表达式带来了很大的不同。现在笑脸的替换很容易发生。由于笑脸的表示形式中有单词和常用字符,单个正则表达式的长度约为200。但仍然值得付出努力:)这与加载图像无关,笑脸图像的大小和大小都太小了并不是所有的都是必需的(在大多数情况下甚至比allSmilyImage还小!)这与加载图像无关,smiley图像太小,并且不是所有的都是必需的(在大多数情况下甚至比allSmilyImage还小!)