1

我想在 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

4 回答 4

3

像这样使用正则表达式函数:

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

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

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

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

于 2012-08-20T11:51:11.813 回答
2

如果您的输入完全符合上面给出的格式,您甚至不需要正则表达式 - 只需剥离外部标签:

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

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


如果您的输入不止于此(即一段重要的 HTML 或完整的 HTML 文档),正则表达式仍然不是理想的工具 - 相反,您应该使用 HTML 解析器,例如JSoup

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

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

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

于 2012-08-20T11:59:14.840 回答
1

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

$("em").html();

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

看到这个小提琴

于 2012-08-20T12:24:32.970 回答
0

我必须删除特定标签之后的任何文本。现在 HTML 内容是从满足 5 种不同语言的数据库中动态生成的。所以我只有 div 标签来帮助我。我不确定为什么 REMatch("(?s).*?", 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>
于 2013-09-10T11:23:35.250 回答