Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/41.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_Jquery - Fatal编程技术网

Javascript 如何在包含粗体和斜体标记时获取字符串的第一个文本节点?

Javascript 如何在包含粗体和斜体标记时获取字符串的第一个文本节点?,javascript,jquery,Javascript,Jquery,字符串是动态的 它起源于用户单击dom中任意位置时的onclick事件 如果字符串的第一部分是: “loginuseraccount” 包含在如下元素中: “loginuseraccount” 然后我可以用这个: alert($(s).find('*').andSelf().not('b,i').not(':empty').first().html()); // result is : login<b>user</b>account alert($(s).find

字符串是动态的

  • 它起源于用户单击dom中任意位置时的onclick事件

  • 如果字符串的第一部分是:

    loginuseraccount

  • 包含在如下元素中:

    loginuseraccount

    然后我可以用这个:

    alert($(s).find('*').andSelf().not('b,i').not(':empty').first().html());
    // result is : login<b>user</b>account
    
    alert($(s).find('*').andSelf().not('b,i').not(':empty').first().html());
    //结果是:loginuseraccount
    
    但是在这种情况下,当它不包含在任何元素中时,我如何才能得到相同的结果。当它不包含在任何元素中时?

    我尝试了下面的代码,当第一部分不包含任何
    时,它可以正常工作,但当它包含这些标记时,它只提供“login”

     var s = $.trim('login<b>user</b> account<tbody> <tr> <td class="translated">Lorem ipsum dummy text</td></tr><tr><td class="translated">This is a new paragraph</td></tr><tr><td class="translated"><b>Email</b></td></tr><tr><td><i>This is yet another text</i></td> </tr></tbody>');
    
        if(s.substring(0, s.indexOf('<')) != ''){
           alert(s.substring(0, s.indexOf('<')));
        }
    
    var s=$.trim('loginuser帐户Lorem ipsum虚拟文本这是一个新的段落,这是另一个文本');
    
    if(s.substring(0,s.indexOf)(“您试图检索到第一个元素之前的所有文本,该元素不是
    ,但该文本可以包装在元素本身中。这非常棘手。我觉得有更好的方法来实现您试图实现的任何内容,但这里有一个有效的解决方案

    function initialText(s){
      var test  = s.match(/(<.+?>)?.*?<(?!(b|\/|i))/);
    
      var match = test[0];
      var prefixed_element = test[1];
    
      // if the string was prefixed with an element tag
      // remove it (ie '<div> blah blah blah')
      if(prefixed_element) match = match.slice(prefixed_element.length);
    
      // remove the matching < and return the string
      return match.slice(0,-1);
    }
    
    函数初始值文本{
    
    var test=s.match(/()?*)?您正在尝试检索第一个元素之前的所有文本,该元素不是
    ,但此文本可以包装在元素本身中。这非常棘手。我觉得有更好的方法来实现您试图实现的任何内容,但这里有一个解决方案

    function initialText(s){
      var test  = s.match(/(<.+?>)?.*?<(?!(b|\/|i))/);
    
      var match = test[0];
      var prefixed_element = test[1];
    
      // if the string was prefixed with an element tag
      // remove it (ie '<div> blah blah blah')
      if(prefixed_element) match = match.slice(prefixed_element.length);
    
      // remove the matching < and return the string
      return match.slice(0,-1);
    }
    
    函数初始值文本{
    var test=s.match(/()?*?尝试以下方法:

    if (s.substring(0, s.indexOf('<')) != '') {
      alert(s.substring(0, s.indexOf('<tbody>')));
    }
    
    if(s.substring(0,s.indexOf)(“请尝试以下操作:

    if (s.substring(0, s.indexOf('<')) != '') {
      alert(s.substring(0, s.indexOf('<tbody>')));
    }
    

    if(s.substring)(0,s.indexOf('所以它只是一个
    b
    或一个
    i
    ,呵呵

    递归函数永远是最好的选择,而这一次,它可能是最好的选择

    var s = function getEm(elem) {
        var ret = ''
    
        // TextNode? Great!
        if (elem.nodeType === 3) {
            ret += elem.nodeValue;
        }
    
        else if (elem.nodeType === 1 &&
            (elem.nodeName === 'B' || elem.nodeName === 'I')) {
    
            // Element? And it's a B or an I? Get his kids!
            ret += getEm(elem.firstChild);
        }
    
        // Ain't nobody got time fo' empty stuff.
        if (elem.nextSibling) {
            ret += getEm(elem.nextSibling);
        }
    
        return ret;
    }(elem);
    
    Jsfiddle演示了这一点:


    PS:用正则表达式或自定义标记器解析HTML是不好的,不应该这样做。

    所以它只是一个
    b
    i
    ,呵呵

    递归函数永远是最好的选择,而这一次,它可能是最好的选择

    var s = function getEm(elem) {
        var ret = ''
    
        // TextNode? Great!
        if (elem.nodeType === 3) {
            ret += elem.nodeValue;
        }
    
        else if (elem.nodeType === 1 &&
            (elem.nodeName === 'B' || elem.nodeName === 'I')) {
    
            // Element? And it's a B or an I? Get his kids!
            ret += getEm(elem.firstChild);
        }
    
        // Ain't nobody got time fo' empty stuff.
        if (elem.nextSibling) {
            ret += getEm(elem.nextSibling);
        }
    
        return ret;
    }(elem);
    
    Jsfiddle演示了这一点:



    PS:使用正则表达式或自定义标记器解析HTML是错误的,不应该这样做。

    这应该会有帮助,您是否正在尝试获取用户?如问题“我想要此结果”中所述“//结果是:loginuseraccount”你没有给我足够的信息。我猜这个用户实际上会被某人的名字所取代。也有可能这个帐户是某人的帐号?不,它只是一个字符串,可以是“带此标记的文本”或“这是带某些标记的文本”这应该有助于您是否尝试获取用户?如问题“我想要此结果”//结果为:loginuseraccount”中所述你没有给我足够的信息。我猜这个用户实际上会被某人的名字所取代。也有可能这个帐户是某人的帐号?不,它只是一个字符串,可以是“带此标记的文本”或“这是带某些标记的文本”我猜你没有仔细阅读这个问题,我说这个字符串是动态的,这意味着我可以获取任何类型的内容,甚至只是一个没有任何html元素的文本节点。所以你告诉我的是,你希望字符串的第一部分包含一个不是或不完全是的元素!你现在明白了:)幸运的是,我没有解析HTML,甚至没有尝试这样做。我提取的是字符串,我没有尝试解释标记。我将它应用于不同的条件,当我完成它时,我肯定会将它标记为答案。我猜你没有仔细阅读这个问题,我说这个字符串是动态的,意味着我可以获得任何类型的内容,即使是just是一个没有任何html元素的文本节点。因此,您要告诉我的是,您希望字符串的第一部分包含一个不是或不完全是的元素!您现在得到了:)幸运的是,我没有解析HTML,甚至没有尝试这样做。我提取的是字符串,我没有尝试解释标记。我将它应用于不同的条件,当我使用itthanks完成回复@Jai时,我肯定会将它标记为answer,但正如我所说的,这个字符串是动态的,意味着可能有“div”而不是“”或者任何东西因此单词
    account
    是保留的,或者在其他情况下可能会更改。我希望字符串的第一部分包含一个不是or的元素,并且第一部分可以是reply@Jai的任何东西,但正如我所说的,这个字符串是动态的,意味着可能有“div”而不是“”或者任何东西因此word
    account
    是保留的,或者在其他情况下可能会更改。我希望字符串的第一部分包含一个不是or的元素,并且第一部分可以是任何东西,只要提供以下可能的输入
    loginuseraccount
    loginuseraccount
    他想要
    loginuseraccount
    @TheChad是正确的!我希望结果中的标记不在它们之间数据给定以下可能的输入
    loginuseraccount
    loginuseraccount
    他希望
    loginuseraccount
    @结果是正确的!我希望结果中的标记不在它们之间数据