使用jQuery查找文本字符串?


Answers:


327

jQuery具有contains方法。这是您的摘录:

<script type="text/javascript">
$(function() {
    var foundin = $('*:contains("I am a simple string")');
});
</script>

上面的选择器选择包含目标字符串的任何元素。foundin将是一个包含任何匹配元素的jQuery对象。请参阅以下网址中的API信息:网址 https //api.jquery.com/contains-selector/

通配符“ *”要注意的一件事是,您可能会不需要所有元素,包括html和body元素。这就是为什么jQuery和其他地方的大多数示例都使用$('div:contains(“ I am a simple string”)')


12
@Tony,我将如何只处理匹配的文本,而不仅仅是整个段落,div等?
基思·多根

12
应该指出,这是区分大小写的。一个名为“我”的用户在jQuery文档页面上这样写:$ .expr [':']。icontains = function(obj,index,meta,stack){return(obj.textContent || obj.innerText || jQuery( obj).text()||'').toLowerCase()。indexOf(meta [3] .toLowerCase())> = 0; }; 示例:$(“ div:icontains('John')”)。css(“ text-decoration”,“ underline”);
布兰登·布鲁姆

这对json有效吗?如果我想过滤json值中的某些文本怎么办?
Chamilyan 2010年

5
如果文本节点具有换行符,例如,这将不起作用。“我是一个简单的\ n字符串”。请注意,不会显示换行符,因此用户甚至都不知道问题出在哪里。所有这些解决方案都有此问题。参见jsfiddle.net/qPeAx
jesper 2011年

9
-1,不起作用。它返回树中的所有父节点,只需要最低的一个。
TMS

51

通常,jQuery选择器不在DOM的“文本节点”内搜索。但是,如果使用.contents()函数,则将包含文本节点,然后可以使用nodeType属性仅过滤文本节点,并使用nodeValue属性搜索文本字符串。

    $('*','body')
        .andSelf()
        。内容()
        .filter(function(){
            返回this.nodeType === 3;
        })
        .filter(function(){
            //仅当文本中任何地方包含“简单字符串”时才匹配
            返回this.nodeValue.indexOf('simple string')!= -1;
        })
        .each(function(){
            //使用this.nodeValue做一些事情
        });

8
为了澄清,正如Tony提到的,您可以使用“:contains()”选择器在文本节点内进行搜索,但是jQuery不会在结果中返回单个文本节点(只是元素列表)。但是,当您使用.contents()时,jQuery会同时返回元素和文本节点。有关更多信息:docs.jquery.com/Traversing/contents
BarelyFitz

5
我为你为什么使用感到困惑.andSelf()。来自api.jquery.com/andSelf:“jQuery对象维护一个内部堆栈,该堆栈跟踪对匹配的元素集的更改。当调用DOM遍历方法之一时,会将新的元素集推入堆栈。如果前面的一组元素也很理想,.andSelf()可以提供帮助。” 我没有看到以前的情况,我想念什么?
艾伦·H。

1
已投票!应该被接受,因为它可以过滤掉所有父节点,我认为这是大多数情况下的常见需求。

29

这将仅选择包含“我是一个简单的字符串”的叶子元素。

$('*:contains("I am a simple string")').each(function(){
     if($(this).children().length < 1) 
          $(this).css("border","solid 2px red") });

将以下内容粘贴到地址栏中进行测试。

javascript: $('*:contains("I am a simple string")').each(function(){ if($(this).children().length < 1) $(this).css("border","solid 2px red") }); return false;

如果你只是想抓住 “我是一个简单的字符串”。首先将文本包装在一个像这样的元素中。

$('*:contains("I am a simple string")').each(function(){
     if($(this).children().length < 1) 
          $(this).html( 
               $(this).text().replace(
                    /"I am a simple string"/
                    ,'<span containsStringImLookingFor="true">"I am a simple string"</span>' 
               )  
           ) 
});

然后执行此操作。

$('*[containsStringImLookingFor]').css("border","solid 2px red");

3
.filter()函数比.each()有用。实际上,您实际上可以将其放在一个选择器中:“ *:contains('blah'):empty”
尼克

2
#nickf-:empty不会选择包含文本的文本节点。因此,如果文本节点包含“我是一个简单的字符串”,则将其排除在外。docs.jquery.com/Selectors/empty
Slim(适用

2
我知道我来晚了一点,但是这不会忽略字符串存在于顶层但其中有子级的任何文本块吗?例如:<blockquote>我是一个简单的字符串<span style =“ font-weight:bold;”>生活在边缘</ span> </ blockquote>
Ken Bellows 2012年

我只想提及“ containsStringImLookingFor”不是有效的HTML属性。请用于HTML 5“ data-containsStringImLookingFor”。早于5的HTML版本无法添加自定义属性...
Snickbrack '16

17

如果只想使节点最接近要搜索的文本,则可以使用以下命令:

$('*:contains("my text"):last');

如果您的HTML看起来像这样,这甚至可以工作:

<p> blah blah <strong>my <em>text</em></strong></p>

使用上面的选择器将找到<strong>标签,因为那是包含整个字符串的最后一个标签。


1
这似乎不起作用。例如,在此页面上,*:contains(“ the”):last仅返回1个元素。
bzlm 2010年

4
@bzlm:嗯,并不一定要指定他想找到多次出现。
尼克

2
啊哈 有没有办法使它适用于多次出现?我认为这是比涉及递归节点类型检查等的那些更优雅的解决方案
bzlm

1
我可以想到的是获取所有节点(但不是所有祖先)的唯一方法是遍历结果,删除所有父节点,尽管您可能会遇到问题,例如:<p>my text <b>my text</b></p>-删除<b>标签的祖先输掉另一场比赛
尼克


7

只是添加了托尼·米勒的答案,因为这使我90%地获得了我一直在寻找的东西,但仍然没有用。在.length > 0;他的代码末尾添加了我的脚本。

 $(function() {
    var foundin = $('*:contains("I am a simple string")').length > 0;
 });

如何在找到的字符串上附加一个新单词?,我想在找到的作品上添加一个星号。
userAZLogicApps

@SaMolPP foundin += '*';
Pixelomo

2

此功能应该起作用。基本上进行递归查找,直到获得叶节点的唯一列表。

function distinctNodes(search, element) {
    var d, e, ef;
    e = [];
    ef = [];

    if (element) {
        d = $(":contains(\""+ search + "\"):not(script)", element);
    }
    else {
            d = $(":contains(\""+ search + "\"):not(script)");
    }

    if (d.length == 1) {
            e.push(d[0]);
    }
    else {
        d.each(function () {
            var i, r = distinctNodes(search, this);
            if (r.length === 0) {
                e.push(this);
            }
            else {
                for (i = 0; i < r.length; ++i) {
                    e.push(r[i]);
                }
            }
        });
    }
    $.each(e, function () {
        for (var i = 0; i < ef.length; ++i) {
            if (this === ef[i]) return;
        }
        ef.push(this);
    });
    return ef;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.