我有一些字符串可以显示某些html标签,例如
this is a nice day for bowling <b>bbbb</b>
如何使用RegExp替换所有 b 符号,例如:blablabla:(例如),但仅外部html标记?
因此,在这种情况下,结果字符串应该变为
this is a nice day for :blablabla:owling <b>bbbb</b>
编辑:根据我收到的答案,我想更具体一点。首先,我只有一个字符串,而不是DOM元素,或其他任何东西。该字符串可能包含也可能不包含标签(打开和关闭)。主要的想法是能够替换文本中的任何地方,除了内部标签。例如,如果我有一个像
这样的字符串not feeling well today :/ check out this link <a href="http://example.com">http://example.com</a>
正则表达式应该用真正的笑脸图像替换仅第一个:/
,但不应该替换第二个和第三个,因为它们位于标签的内部(和部分标签)。以下是使用其中一个答案的正则表达式的示例代码段。
var s = 'not feeling well today :/ check out this link <a href="http://example.com">http://example.com</a>';
var replaced = s.replace(/(?:<[^\/]*?.*?<\/.*?>)|(:\/)/g, "smiley_image_here");
document.querySelector("pre").textContent = replaced;
<pre></pre>
奇怪但DEMO显示它捕获了正确的组,但替换函数中的相同正则表达似乎无法正常工作。
答案 0 :(得分:0)
try {
Class.forName("com.mysql.jdbc.Driver");
Connection dbaTo = DriverManager.getConnection("jdbc:mysql://localhost:3306/ourDB1", "root", "");
PreparedStatement stat2 = dbaTo.prepareStatement("SELECT * FROM tblEntry");
journEnt = journCombo.getSelectedItem().toString();
String sqlbebe = "INSERT INTO tblJournEnt(strEntJournCode, strEntJournType) VALUES (?, ?)";
PreparedStatement stat3 = dbaTo.prepareStatement(sqlbebe);
ResultSet resultaNgSet = stat2.executeQuery();
if(resultaNgSet.next()) {
do{
kuhaEntCode = resultaNgSet.getString(1);
substring2 = kuhaEntCode.substring(Math.max(kuhaEntCode.length() - 3, 0));
}while(resultaNgSet.next());
} //IF////////////////////////////////////////////////////////////
else{
stringsaEnt = "Ent000";
}
int convertToInt2 = Integer.parseInt(substring2);
int addition2 = convertToInt2 + 1;
if (addition2 >= 10) {
String prd = "ent0";
stringsaEnt = prd + addition2;
}
else {
String prd2 = "ent00";
stringsaEnt = prd2 + addition2;
//pasaEnt(stringsaEnt);
}
stat3.setString(1, stringsaEnt);
stat3.setString(2, journEnt);
stat3.addBatch();
stat3.executeBatch();
stat3.close();
}catch(Exception saiko) {
}
&#13;
var input = "this is a nice day for bowling <b>bbbb</b>";
var result = input.replace(/(^|>)([^<]*)(<|$)/g, function(_,a,b,c){
return a
+ b.replace(/b/g, ':blablabla:')
+ c;
});
document.querySelector("pre").textContent = result;
&#13;
你可以这样做:
<pre></pre>
请注意,在大多数(绝大多数)实际复杂的用例中,操作解析的DOM而不仅仅是字符串会更方便。如果您从HTML页面开始,则可以使用库(某些库,如my one,接受正则表达式)。
答案 1 :(得分:0)
我认为你可以使用这样的正则表达式:(仅用于简单数据而不是嵌套数据)
/<[^\/]*?b.*?<\/.*?>|(b)/ig
如果您想使用正则表达式,我建议您使用以下正则表达式递归删除所有标记,直到删除所有标记:
/<[^\/][^<]*>[^<]*<\/.*?>/g
然后使用替换来查找任何b
。
答案 2 :(得分:0)
使用b
替换所有:blablabla:
的正则表达式本身并不难:
.replace(/b/g, ":blablabla:")
将文本节点放在需要执行搜索和替换的位置有点棘手。
这是一个基于DOM的示例:
function replaceTextOutsideTags(input) {
var doc = document.createDocumentFragment();
var wrapper = document.createElement('myelt');
wrapper.innerHTML = input;
doc.appendChild( wrapper );
return textNodesUnder(doc);
}
function textNodesUnder(el){
var n, walk=document.createTreeWalker(el,NodeFilter.SHOW_TEXT,null,false);
while(n=walk.nextNode())
{
if (n.parentNode.nodeName.toLowerCase() === 'myelt')
n.nodeValue = n.nodeValue.replace(/:\/(?!\/)/g, "smiley_here");
}
return el.firstChild.innerHTML;
}
var s = 'not feeling well today :/ check out this link <a href="http://example.com">http://example.com</a>';
console.log(replaceTextOutsideTags(s));
&#13;
在这里,我们只修改作为名为myelt
的自定义创建元素的直接子节点的文本节点。
结果:
not feeling well today smiley_here check out this link <a href="http://example.com">http://example.com</a>