我正在寻找Javascript的正则表达式来搜索HTML中的文本(例如“span”)。
例:
<div>Lorem span Ipsum dor<a href="blabla">la
的 BLAla</a> dsad <span>2</span> ... </div>
但只应匹配“Lorem”之后的“span”,而不是<span>
标签。
对于第二个示例,如果我们搜索“bla”,则只应匹配粗体文本。
HTML由innerHTML获取,匹配将被<span class="x">$text</span>
包围,然后被重写为此节点的innerHTML,所有这些都没有 kill 其他标记。
我编写了自己的搜索,它通过char搜索char,包含缓存和标记。
感谢帮助人员!
答案 0 :(得分:2)
您可以使用dom方法处理每个文本节点。
此方法获取第一个参数的父节点并循环遍历其所有子节点, 使用作为第二个参数传递的函数处理文本节点。 该函数用于操作测试节点的数据, 例如,在“突出显示”的范围内查找或替换或删除或包装找到的文本。
您可以仅使用第一个参数调用该函数,它将返回一个数组 文本节点,然后您可以使用该数组来操纵文本 - 在这种情况下,数组项是每个节点,并有数据,父母和兄弟姐妹。
document.deepText= function(hoo, fun){
var A= [], tem;
if(hoo){
hoo= hoo.firstChild;
while(hoo!= null){
if(hoo.nodeType== 3){
if(fun){
if((tem= fun(hoo))!== undefined){
A[A.length]= tem;
}
}
else A[A.length]= hoo;
}
else A= A.concat(arguments.callee(hoo, fun));
hoo= hoo.nextSibling;
}
}
return A;
}
//测试用例
function ucwords(pa, rx){
var f= function(node){
var t= node.data;
if(t && t.search(rx)!=-1){
node.data= t.replace(rx,function(w){return w.toUpperCase()});
return node;
}
return undefined;
}
return document.deepText(pa, f);
}
<强> ucwords(document.body的,/ \ bspan \ B / IG)强>
答案 1 :(得分:1)
如果你在DOM元素中有HTML,你可以使用textContent / innerText来获取文本(没有任何HTML标签):
var getText = function(el) {
return el.textContent || el.innerText;
};
// usage:
// <div id="myElement"><span>Lorem</span> ipsum <em>dolor<em></div>
alert(getText(document.getElementById('myElement'))); // "Lorem ipsum dolor"
答案 2 :(得分:1)
(?<!\<|/)span
这应该给出非标签的所有跨度出现。希望这有助于至少一点:)
说明:找到不之前的每个span
出现<
或/
答案 3 :(得分:1)
使用jQuery可以轻松完成您想要做的事情:
$("span:contains('blah'))
如果要进行正则表达式匹配,请执行上一个堆栈溢出示例中的操作:
要获得更优雅的解决方案,请创建custom selector。
答案 4 :(得分:1)
/span(?=[^>]*<)/
换句话说,从“span”一词的末尾向前看,在下一个开口角括号之前没有关闭角括号,所以我们不能在标签内。据推测,引用属性值可以包含结束尖括号,但我从未见过它。但是,为了涵盖这种可能性,你可以使用这个正则表达式:
/span(?=(?:[^>"']+|"[^"]*"|'[^']*')*<)/
答案 5 :(得分:0)
如果我理解正确,您需要搜索单词,但只能搜索不属于HTML标记的单词。
我没有给你一个确切的答案,但我用来开发正则表达式的一些工具是这个网站:http://www.regular-expressions.info/和这个程序:http://www.radsoftware.com.au/regexdesigner/
答案 6 :(得分:0)
在一般情况下,这可能是不可能的,因为您需要计算正则表达式无法实现的开始和结束标记。
Regex不是处理XML的智能解决方案。相反,您应该使用HTML或XML DOM方法来提取所需的信息。
如果您真的想要或需要使用正则表达式,可以尝试以下内容。
>[^<]*bla[^<]*<
但我确信这在一般情况下不起作用。
答案 7 :(得分:0)
* * 使用前瞻
找到了一个新的解决方案 var pageHTML =" <span aa span > span asa span";
var regex = "span(?!([^<]+)?>)";
这个正则表达式只会在没有“&lt;”的情况下才会找到“span”这个词然后它有“&gt;”在它之后。
**旧解决方案
这是我的解决方案,我正在寻找“asd”,如果周围有开放和关闭的标签,我会忽略这个匹配。
我这样做,通过查看匹配单词的右侧和左侧,如果我发现它被标签包围,我会返回相同的匹配单词“我不会替换它”,如果不是,我将其替换为我需要的文字
var pageHTML =" < aa asd > asd < asd";
var regex = "asd";
var pattern = new RegExp(regex, "gi");
var replaceWord = "dsa";
//Replace all instances of word/words with our special spans
pageHTML = pageHTML.replace(pattern, function(match, index, original){
var leftIndex = index;
var rightIndex = parseInt(parseInt(index)+match.length);
var insideTag = false;
var foundOpenTag = false;
for(; leftIndex > 0; leftIndex--){
if(pageHTML.charAt(leftIndex) == ">")
break;
if(pageHTML.charAt(leftIndex) == "<"){
foundOpenTag = true;
break;
}
}
if(!foundOpenTag){
return replaceWord;
}
for(; rightIndex < pageHTML.length ; rightIndex++){
if(pageHTML.charAt(rightIndex) == "<")
break;
if(pageHTML.charAt(rightIndex) == ">" ){
insideTag = true;
break;
}
}
if(insideTag)
return match;
else return replaceWord;
});
警报(pageHTML);