1
  1. String(s) is dynamic

  2. It is originated from onclick event when user clicks anywhere in dom

  3. if string(s)'s first part that is:

    "login<b>user</b>account"

is enclosed in some element like this :

"<div>login<b>user</b>account</div>",

then I can get it with this:

alert($(s).find('*').andSelf().not('b,i').not(':empty').first().html());
// result is : login<b>user</b>account

But how can i get the same result in this condition when it is not enclosed in any element .i.e. when it is not enclosed in any element?

I tried this below code which works fine when first part do not include any <b></b> but it only gives "login" when it does include these tags.

 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('<')));
    }

Note: Suggest a generic solution that is not specific for this above string only. It should work for both the cases when there is bold tags and when there ain't any.

4

3 に答える 3

4

つまり、それは単なる abまたは aiです。

再帰関数は常に進むべき道です。そして今回は、おそらくそれが最善の方法です。

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: http://jsfiddle.net/Ralt/TZKsP/

PS: 正規表現またはカスタム トークナイザーを使用して HTML を解析することは不適切であり、行うべきではありません。

于 2013-01-24T08:04:15.683 に答える
1

<b>またはではない最初の要素までのすべてのテキストを取得しようとしています<i>が、このテキストは要素自体にラップされている可能性があります。これは非常にトリッキーです。あなたが達成しようとしていることは何でも実装するためのより良い方法があるように感じますが、ここにうまくいく解決策があります.

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);
}

幸運なことに、私はこの問題が面白くて挑戦的であることに気づきました。繰り返しますが、これはばかげているからです。

どういたしまして ;-)

于 2013-01-24T07:18:10.327 に答える
0

これを試して:

if (s.substring(0, s.indexOf('<')) != '') {
  alert(s.substring(0, s.indexOf('<tbody>')));
}
于 2013-01-24T07:24:40.990 に答える