如何在这两个em标签之间获取所有内容的字符串?

时间:2012-08-20 08:34:44

标签: regex coldfusion html-parsing coldfusion-8

我想在em标签之间获取字符串,包括其他html。

例如:

<em>UNIVERSALPOSTAL UNION - International Bureau Circular<br />
By: K.J.S. McKeown</em>

输出应为:

UNIVERSALPOSTAL UNION - International Bureau Circular<br />
    By: K.J.S. McKeown

请帮帮我。

由于

4 个答案:

答案 0 :(得分:3)

使用正则表达式函数,如下所示:

REMatch("(?s)<em>.*?</em>", html)

另请参阅:http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=regexp_01.html

  • (?s)将模式设置为单行,这样输入文本即使包含换行符也会被解释为一行。 这可能是默认值(我不确定)所以可以省略。正如Peter在评论中指出的那样,这不是默认值,因此必须设置。

  • .*?匹配<em></em>之间的所有字符。乘数之后的问号使其“非贪婪”,以便尽可能少的字符匹配。如果输入html包含<em>foo</em><em>bar</em>之类的内容,则需要这样做,否则只考虑最外面的<em></em>标记。

  • 返回的数组包含找到的所有匹配项,即所有文本,包括<em>标记中的html。

请注意,如果</em>也作为属性文本出现并且错误地不是html编码,例如:<em><a title="Help for </em> tag">click</a></em>或在其他罕见情况下(例如javascript脚本标记等),这可能会失败。正则表达式无法替换完整的HTML / XML解析器,如果您需要100%准确性,则应考虑使用一个:http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_t-z_23.html

答案 1 :(得分:2)

如果您的输入完全采用上面给出的格式,您甚至不需要正则表达式 - 只需删除外部标记:

<cfsavecontent variable="Input">[text from above]</cfsavecontent>

<cfset Output = mid( Input, 4 , len(Input) - 9 />


如果你的输入超过这个(即一个重要的HTML或完整的HTML文档),正则表达式仍然不是理想的工具 - 而是你应该使用HTML解析器,例如{ {3}}:

<cfset jsoup = createObject('java','org.jsoup.Jsoup') />

<cfset Output = jsoup.parse(Input).select('em').html() />

(对于CF8,此代码需要将jsoup JAR文件放在CF的lib目录中,或使用JSoup等工具。)

答案 2 :(得分:1)

如果你正在使用jquery,你也可以很容易地做到这一点。

$("em").html();

将返回em标签之间的所有html。

请参阅此fiddle

答案 3 :(得分:0)

我必须删除partiucular标签后要遵循的任何文本。现在,HTML内容是从一个满足5种不同语言的数据库动态生成的。所以我只有div标签来帮助我。我不确定为什么REMatch(&#34;(?s)。*?&#34;,html)对我不起作用。然而,本在这里帮助了我(http://www.bennadel.com/blog/769-Learning-ColdFusion-8-REMatch-For-Regular-Expression-Matching.htm)。我的代码看起来像tghis:

<cfset extContentArr = REMatch("(?i)<div class=""inlineBlock"" style=""margin-right:30px;"">.+?</div>",qry_getContent.colval) />
<cfif !ArrayIsEmpty(extContentArr)>
  Loop the array and do whatever you need with the extract , I just deleted them.
</cfif>