regex - ColdFusion , REGEX - 给定文本,查找 SPAN 中包含的所有项目

标签 regex coldfusion

我想学习如何在 Coldfusion 中创建一个 REGEX,它将扫描大量 html 文本并创建一个项目列表。

我要的元素在下面之间

<span class="findme">The Goods</span>

感谢您提供的任何提示。

最佳答案

你不说是什么版本的CF。从 v8 开始,您可以使用 REMatch得到一个数组

results = REMatch('(?i)<span[^>]+class="findme"[^>]*>(.+?)</span>', text)

使用 ArrayToList 将其转换为列表。 对于旧版本,使用 REFindNoCase 并使用 Mid() 来提取子字符串。

编辑:为了回答您的后续评论,使用 REFind 返回所有匹配项的过程非常复杂,因为该函数仅返回第一个匹配项。这意味着您实际上必须多次调用 REFind,每次都传递一个新的 startpos。 Ben Forta 编写了一个 UDF,它正是这样做的,可以为您节省一些时间。

<!---
Returns all the matches of a regular expression within a string.
NOTE: Updated to allow subexpression selection (rather than whole match)

@param regex      Regular expression. (Required)
@param text       String to search. (Required)
@param subexnum   Sub-expression to extract (Optional)
@return Returns a structure.
@author Ben Forta (ben@forta.com)
@version 1, July 15, 2005
--->
<cffunction name="reFindAll" output="true" returnType="struct">
<cfargument name="regex" type="string" required="yes">
<cfargument name="text" type="string" required="yes">
<cfargument name="subexnum" type="numeric" default="1">

<!--- Define local variables --->    
<cfset var results=structNew()>
<cfset var pos=1>
<cfset var subex="">
<cfset var done=false>

<!--- Initialize results structure --->
<cfset results.len=arraynew(1)>
<cfset results.pos=arraynew(1)>

<!--- Loop through text --->
<cfloop condition="not done">

   <!--- Perform search --->
   <cfset subex=reFind(arguments.regex, arguments.text, pos, true)>
   <!--- Anything matched? --->
   <cfif subex.len[1] is 0>
      <!--- Nothing found, outta here --->
      <cfset done=true>
   <cfelse>
      <!--- Got one, add to arrays --->
      <cfset arrayappend(results.len, subex.len[arguments.subexnum])>
      <cfset arrayappend(results.pos, subex.pos[arguments.subexnum])>
      <!--- Reposition start point --->
      <cfset pos=subex.pos[1]+subex.len[1]>
   </cfif>
</cfloop>

<!--- If no matches, add 0 to both arrays --->
<cfif arraylen(results.len) is 0>
   <cfset arrayappend(results.len, 0)>
   <cfset arrayappend(results.pos, 0)>
</cfif>

<!--- and return results --->
<cfreturn results>
</cffunction>

这为您提供了每个匹配项的开始(pos)和长度,以便使用另一个循环获取每个子字符串

<cfset text = '<span class="findme">The Goods</span><span class="findme">More Goods</span>' />
<cfset pattern = '(?i)<span[^>]+class="findme"[^>]*>(.+?)</span>' />
<cfset results = reFindAll(pattern, text, 2) />
<cfloop index="i" from="1" to="#ArrayLen(results.pos)#">
    <cfoutput>match #i#: #Mid(text, results.pos[i], results.len[i])#<br></cfoutput>
</cfloop>

编辑:使用 subexnum 参数更新了 reFindAll。将其设置为 2 将捕获第一个子表达式。默认值 1 捕获整个匹配项。

关于regex - ColdFusion , REGEX - 给定文本,查找 SPAN 中包含的所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2414576/

相关文章:

python - 用于在所有空格处拆分的正则表达式 Python

coldfusion - 查询变量范围的查询

coldfusion - 使用 ColdFusion YesNoFormat 时如何屏蔽是/否

ruby - 不匹配两个下划线的正则表达式

python正则表达式匹配逗号

coldfusion - 如何去掉一个url变量

coldfusion - onCFCRequest 似乎正在吃掉我的返回值

coldfusion - 如何在 coldfusion <cfscript> 中使用 <form> 标签

javascript - JS 正则表达式匹配句子

regex - 如何使用testthat以未知顺序测试多个警告?