使用rereplace删除代码

时间:2014-12-05 19:37:41

标签: regex coldfusion

您好以下代码,我使用以下代码从页面中删除我不知道的内容:

我正在使用正则表达式,我不能使用jsoup,请不要提供任何jsoup链接或代码,因为这对我来说没用。

<cfset removetitle = rereplacenocase(cfhttp.filecontent, '<title[^>]*>(.+)</title>', "\1")>

现在以同样的方式,我想使用以下内容:

1. <base href="http://search.google.com">
2. <link rel="stylesheet" href="mystyle.css">
3. and there are 5 tables inside the body, i want to remove the 2nd table.,

任何人都可以指导这个

1 个答案:

答案 0 :(得分:7)

Scott是对的,Leigh was right之前,当你提出类似的问题时,jSoup是你最好的选择。

关于正则表达式解决方案。正则表达式可以实现这一点,但正则表达式无法解决问题。例如,如果第一个或第二个表包含嵌套表,则此正则表达式将跳闸。 (请注意,表之间不需要文本,我只是证明表之间可以有事情)

(如果总是有一个嵌套表,正则表达式可以处理它,但如果有时候有嵌套表,换句话说:未知),它会变得更加混乱。)

<cfsavecontent variable="sampledata">
<body>
<table cellpadding="4"></table>stuff
is <table border="5" cellspacing="7"></table>between
<table border="3"></table>the
<table border="2"></table>tables
<table></table>
</body>
</cfsavecontent>

<cfset sampledata = rereplace(sampledata,"(?s)(.*?<table.*?>.*?<\/table>.*?)(<table.*?>.*?<\/table>)(.*)","\1\3","ALL") />
<cfoutput><pre>#htmleditformat(sampledata)#</pre></cfoutput>

这是做什么的

(?s)套。也匹配换行符。 (.*?<table.*?>.*?<\/table>.*?)匹配第一个表,第一个表以及它与第二个表之间的所有内容之前的所有内容,并将其设置为捕获组1。 (<table.*?>.*?<\/table>)匹配第二个表并创建捕获组2。 (.*)匹配第二个表之后的所有内容并创建捕获组3。

然后第三个参数\1\3选择第一个和第三个捕获组。

如果您可以控制源文档,则可以创建类似

的html注释
<!-- table1 -->
  <table>...</table>
<!-- /table1 -->

然后在正则表达式中使用它,最后得到一个更加正则表达式的文档。

然而,斯科特说,最好不要使用适当的工具来完成任务:

  

这就像告诉木匠,给我建房子,但不要用锤子。

这些工具的创建是因为程序员经常遇到你正在遇到的问题,因此他们创建了一个工具,并且经常自由地共享它,因为它可以更好地完成工作。