Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/73.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_Html_Regex_Algorithm_Search - Fatal编程技术网

Javascript 匹配一个单词,候选词可以跨连续组(跨度)

Javascript 匹配一个单词,候选词可以跨连续组(跨度),javascript,html,regex,algorithm,search,Javascript,Html,Regex,Algorithm,Search,用户将提供一些搜索词。假设它是一个字符串,可能包含任何单词或特殊字符,如/、?、$、*,等等 我需要在HTML中出现的任何地方匹配这个字符序列,即使搜索词跨越了连续的跨度;在我的HTML中,特殊字符有时单独包装 例如:用户提供您的妈妈?,其中有一段包含您的妈妈 我需要一种有效的方法来确定a查询确实存在,b哪些元素包含查询。搜索的文本可能是复杂的HTML,并且包含大量的单词、跨距、div等。您首先必须将字符分成多个组。要做到这一点,最偏执的方式是通过性格,但这最终将是非常低效的。知道我对您的数据所

用户将提供一些搜索词。假设它是一个字符串,可能包含任何单词或特殊字符,如/、?、$、*,等等

我需要在HTML中出现的任何地方匹配这个字符序列,即使搜索词跨越了连续的跨度;在我的HTML中,特殊字符有时单独包装

例如:用户提供您的妈妈?,其中有一段包含您的妈妈


我需要一种有效的方法来确定a查询确实存在,b哪些元素包含查询。搜索的文本可能是复杂的HTML,并且包含大量的单词、跨距、div等。

您首先必须将字符分成多个组。要做到这一点,最偏执的方式是通过性格,但这最终将是非常低效的。知道我对您的数据所做的很少,我假设任何与[a-zA-Z\s]+匹配的东西都会成为一个标记,而其他所有东西都会成为另一个标记

另一件合乎逻辑的事情是做一个迭代过程,在每次失败的尝试之后,您都会进一步分解它

无论您决定做什么,您都需要使用一些JavaScript来实现这一点。但这应该相当容易做到

在拆分之后,您需要开始考虑构建正则表达式

您可以将?:]*>\s**放在每个标记之间,但在将某些字符放入正则表达式之前,需要对其进行转义。某处有一个完整的列表,但其中包括:$^*+?/\{}[]

例如,您可能会得到如下结果:

/your mom(?:<[^>]*>\s*)*\?/i

我可能会尝试编写一个解析器来区分标记的开始和结束,以及它们的文本内容,希望HTML不包含不完整的标记。对于索引,也许可以使用一组元组,每个元组表示深度和计数,以及当前状态的内存。您的简单示例的索引如下:

[(1,1)] tag opens, text: 'Your mom'
query text matches so far
[(1,1),(1,1)] tag closes, remove. 
[(1,2)] tag opens, maintain depth, increase count, text: '?'
query text continues to match
[(1,2)] tag closes, remove

此解决方案将查找并返回包含搜索文本的第一个元素,即使该文本包含嵌入的标记

TL;博士,玩这个例子吧

var content=$content; var search=$search; var go=$go; 函数escapeRegExpstr{ 返回str.replace/[\/\\{}*+?.^$|[\]-]/g,\\$&; } 函数recursiveElementSearchregex,元素{ var text=element.text; 如果text.matchregex{ var children=element.children; var len=children.length; 对于变量i=0;i去以任何顺序?区分大小写?您需要提供更多详细信息。不按任何顺序,如果匹配,它们将是连续的兄弟组,搜索词需要按正确的顺序。所以,只需忽略HTML?jquery.text呢?。只要我知道哪些节点实际包含术语的一部分,text就好了:/i我认为使用堆栈是正确的方法,我得弄清楚如何进行部分匹配-到目前为止,在你的explanation@neaumusic进行部分匹配的一种方法是逐字符比较并记住最后一个字符索引。@neaumusic如果这有助于回答您的问题,请单击答案旁边的复选标记,将其标记为已接受的答案。完成此操作后,复选标记颜色将变为绿色,表示它现在已被接受。谢谢D
[(1,1)] tag opens, text: 'Your mom'
query text matches so far
[(1,1),(1,1)] tag closes, remove. 
[(1,2)] tag opens, maintain depth, increase count, text: '?'
query text continues to match
[(1,2)] tag closes, remove