我想学习如何在 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/