0

好的,我的 div 中确实有以下数据

<div id="mydiv">
<!--
 what is your present
 <code>alert("this is my present");</code>
 where?
 <code>alert("here at my left hand");</code>
 oh thank you! i love you!! hehe
  <code>alert("welcome my honey ^^");</code>
-->
</div>

好吧,我需要做的是获取<code>块内的所有脚本和 html 代码文本节点,而不删除里面的 html 注释。好吧,这是我教授的作业,我不能修改那个 div 块..

我需要为此使用正则表达式,这就是我所做的

var block = $.trim($("div#mydiv").html()).replace("<!--","").replace("-->","");
var htmlRegex = new RegExp(""); //I don't know what to do here
var codeRegex = new RegExp("^<code(*n)</code>$","igm");

var code = codeRegex.exec(block);
var html = "";

真的不行。。请不要给出确切的答案。。请教教我。。谢谢

我需要有以下变量块code

alert("this is my present");
alert("here at my left hand");
alert("welcome my honey ^^");

这是我需要的变量块html

 what is your present
     where?
     oh thank you! i love you!! hehe

我的问题是获得上述结果的正则表达式模式是什么?

4

3 回答 3

5

使用正则表达式解析 HTML 不是您应该做的事情。

我敢肯定你的教授认为他/她真的很聪明,并且没有办法访问 DOM API,并且可以挥舞横幅并证明使用正则表达式解析 DOM 的一些小角落案例是合理的,有时它还可以。

嗯,不,不是。如果那里有复杂的代码,会发生什么?您的正则表达式会中断,如果它曾经在生产中,它可能会成为一个安全漏洞。

所以在这里:

http://jsfiddle.net/zfp6D/

  1. 走dom,从节点中获取nodeType 8(注释)文本值。
  2. 调用HTML解析器(浏览器用来解析HTML的东西,而不是正则表达式,为什么你不使用HTML解析器来解析HTML完全超出了我的理解,就像说“是的,我可以用锤子钉上这个钉子,但我想我会用脚踩在钉子上,直到钉子钉进去”)。
  3. 在新解析的 HTML 中查找所有 CODE 元素。
  4. 将它们记录到控制台,或任何你想对它们做的事情。
于 2012-07-07T17:35:08.127 回答
1

首先,您应该知道,由于 HTML 不是正则语言,因此您不能使用适用于所有有效输入的正则表达式进行通用解析(特别是通用嵌套不能用正则表达式表示)。许多解析器确实使用正则表达式来匹配单个标记,但需要围绕它们构建其他算法

但是,对于像这样的固定输入,这只是处理您拥有的结构的一种情况(尽管使用不同的解析方法通常比使用正则表达式更容易)。

首先让我们获取所有代码:

var code = '', match = [];
var regex = new RegExp("<code>(.*?)</code>", "g");
while (match = regex.exec(content)) {
    code += match[1] + "\n";
}

我假设content包含您已经提取的 div 的内容。这里的“g”标志表示这是“全局”匹配,所以我们可以重用正则表达式来查找每个匹配项。方括号表示一个捕获组,.表示任何字符,*表示重复 0 次或多次,?表示“非贪婪”(看看没有它会发生什么,看看它做了什么)。

现在我们可以做类似的事情来获取所有其他位,但这次正则表达式稍微复杂一些:

new RegExp("(<!--|</code>)(.*?)(-->|<code>)", "g")

这里|的意思是“或”。所以这匹配所有以“开始注释”或“结束代码”开头并以“结束注释”或“开始代码”结尾的位。另请注意,我们现在有 3 组括号,因此我们要提取的部分是match[2](第二组)。

于 2012-07-07T16:45:53.027 回答
1

你做了很多不必要的事情。.html() 将内部内容作为字符串提供给您。您应该能够使用 regEx 从那里准确获取您需要的内容。此外,尝试坚持使用正则表达式文字(例如/^regexstring$/)。您必须使用非常混乱的新 RegExp 来转义转义字符。当您需要将字符串 var 放入正则表达式时,您通常只想使用新的正则表达式。

字符串的匹配函数接受正则表达式并在您添加全局标志时返回每个匹配项的集合(例如/^regexstring$/g<--注意'g')。我会做这样的事情:

var block = $('#mydiv').html(), //you can set multiple vars in one statement w/commas
matches = block.match(/<code>[^<]*<\/code>/g);

//[^<]* <-- 0 or more characters that aren't '<' - google 'negative character class'

matches.join('_') //lazy way of avoiding a loop - join into a string with a safe character
.replace(/<\/*code>/g,'') //\/* 0 or more forward slashes
.split('_');//return the matches string back to array

//Now do what you want with matches. Eval (ew) or append in a script tag (ew).
//You have no control over the 'ew'. I just prefer data to scripts in strings
于 2012-07-07T18:08:52.663 回答