使用jQuery测试字符串是否包含HTML标记

时间:2014-04-04 20:10:32

标签: javascript jquery html

我想测试字符串中是否包含html标签。

html = "<p class=\"c\">some <span>conten<b class=\"i\">t</b></span><p><p>more content</p><p><i>important</i>";

我认为使用find()has()会帮助我做到这一点,但它不起作用。

$(html).find("p") //[]
$(html).has("p")  //[]

如果我进行实验,我会得到令人困惑的结果。

$(html).has("p") //[]
$(html).has("*") //array of <p> elements and children
$(html).has("*") == true //false
$(html).has("*").length == true //false ??

为什么我不能使用这些方法来查看我的字符串是否包含HTML标记?

由于

2 个答案:

答案 0 :(得分:9)

.has().find()都对给定元素的子节点进行操作。要测试元素本身,请使用.is()

$(html).is('p');   // true
$(html).is('div'); // false
$(html).is('*');   // true

...虽然我对后者的用处持怀疑态度,因为它没有专门针对HTML元素进行测试。所以这......

var someMarkup = '<foo"bar"zzz>';
$(someMarkup).is('*');

...也是true。如果您省略此表达式中的最后一个>,则您甚至无法到达is

var noHtmlJustLt = '<';
$(noHtmlJustLt).is('*'); // Error: Syntax error, unrecognized expression: <

...所以你必须把它包装成try-catch块。


说实话,我可能用不同的方法解决整个任务(检查一个字符串是否有一些流氓标记):用一个常见的技巧逃避原始文本...

var newHtml = $('<div></div>').html(html).text();

...然后将其与原始html内容进行比较。如果没有标记符号,则它们应该相等。

答案 1 :(得分:2)

只有filter()is() 才能处理根元素,因此要在整个字符串中搜索标记,您必须将其设置为另一个空元素的innerHTML ,并使用find()搜索,这只适用于子项,因此包装父元素

var has_p = $('<div />', {html : html}).find("p").length > 0;