Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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:给定HTML字符串中的偏移量和子字符串长度,父节点是什么?_Javascript_Regex_String - Fatal编程技术网

JavaScript:给定HTML字符串中的偏移量和子字符串长度,父节点是什么?

JavaScript:给定HTML字符串中的偏移量和子字符串长度,父节点是什么?,javascript,regex,string,Javascript,Regex,String,我当前的项目需要在元素的文本内容中定位字符串数组,然后将那些匹配的字符串包装到中 这对我来说意味着我必须确定每个匹配字符串所在的节点,然后遍历它的祖先,直到我点击,检查是否遇到 其次,这可能吗?如果可能,我将如何处理它?您可能应该迭代dom元素。下面是一个简单的递归dom迭代器,您可以填写以下内容: function iterateDom (node) { switch (node.nodeType) { case 1: // ELEMENT_NODE {

我当前的项目需要在元素的文本内容中定位字符串数组,然后将那些匹配的字符串包装到

这对我来说意味着我必须确定每个匹配字符串所在的节点,然后遍历它的祖先,直到我点击
,检查是否遇到


其次,这可能吗?如果可能,我将如何处理它?

您可能应该迭代dom元素。下面是一个简单的递归dom迭代器,您可以填写以下内容:

function iterateDom (node) {
switch (node.nodeType) {
    case 1: // ELEMENT_NODE
        {
        if (node.tagName != "H1") {
            for (var i=0; i<node.childNodes.length; i++)
                    iterateDom(node.childNodes[i]);
            }
        }
        break;
    case 3: //TEXT_NODE
        {
        // node.nodeValue = node.nodeValue.replace(...);
        break;
    }
return true;
}
函数迭代对象(节点){
开关(node.nodeType){
案例1://元素\节点
{
如果(node.tagName!=“H1”){

对于(var i=0;i请看一下。它几乎可以满足您的需要,因为您需要一个链接,并且只需要每个单词的第一次出现。它非常简单,所以要让它工作起来应该不需要太多工作(即使您不使用jQuery,它也可以帮您很多忙-它在内部不使用jQuery,只用于选择DOM元素).

谢谢-这很有用-但我如何获得原始节点?我需要处理的只是一个HTML字符串和一个偏移量。我如何从该字符串位置转到该字符串位置所属的节点?+1,@Bungle-这是一种比维护索引跟踪更好的方法,您可以使用上面的方法递归到非
节点,并在到达文本节点(nodeType==3)后,使用字符串中的replace()函数。如果只有html,则可以执行以下操作:var tmp=document.createElement(“DIV”);tmp.innerHTML=myHtml;iterateDom(tmp);或诸如此类。aaaahh,我明白了。我遗漏了一个可能很关键的要求-我只能链接HTML块中链接的第一个匹配项。看起来您的示例迭代器函数保留了文本节点的顺序,但是,因此我认为这可能还是可行的-我只需要将文本节点存储在数组中,循环thr通过它并使用匹配的父节点字符串测试每个节点(剔除
),然后在找到第一个有效匹配项后设置一个标志,这样我就不会再链接其他匹配项了。非常感谢您的帮助!谢谢,Kobi!我最终根据rob的回答来实现我的方法,但是您建议的jQuery Highlight插件实际上给了我一些灵感,让我能够将匹配项封装在
元素中。我对此表示感谢.
['paragraph', 'example']
<div>
  <p>This is a <a href="http://www.example.com/">paragraph</a> of text used
     as an <a href="http://www.example.com/">example</a> in this Stack
     Overflow question.</p>
</div>
<div>
  <h1>Example</a>
  <p>This is a <a href="http://www.example.com/">paragraph of text</a> used
     as an example in this Stack Overflow question.</p>
</div>
function iterateDom (node) {
switch (node.nodeType) {
    case 1: // ELEMENT_NODE
        {
        if (node.tagName != "H1") {
            for (var i=0; i<node.childNodes.length; i++)
                    iterateDom(node.childNodes[i]);
            }
        }
        break;
    case 3: //TEXT_NODE
        {
        // node.nodeValue = node.nodeValue.replace(...);
        break;
    }
return true;
}