regex - ColdFusion,正则表达式-给定TEXT,查找SPAN中包含的所有项目

原文 标签 regex coldfusion

我正在寻找学习如何在Coldfusion中创建REGEX,该REGEX将扫描大量的html文本并创建项目列表。

我想要的项目包含在以下之间

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

感谢您提供任何提示,以实现这一目标。

最佳答案

您没有说什么版本的CF。从v8开始,您可以使用REMatch获取数组

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

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

编辑:要回答您的后续评论,涉及到使用REFind返回所有匹配项的过程,因为该函数仅返回FIRST匹配项。这意味着您实际上必须多次调用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,正则表达式-给定TEXT,查找SPAN中包含的所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2414576/

相关文章:

javascript - 加入正则表达式

regex - sed在特定匹配行的末尾添加一些内容

regex - 找到5个相同字符后的修剪字符串

sql - 如何随机分配结果集的一部分顺序?

javascript - Coldfusion网址变量

java - Java Regex组匹配空格

javascript - 自定义数据注释-客户端验证

coldfusion - 数组/列表上的cfloop不允许引用以前的值

coldfusion - pdf 类型的 Cfdocument 不显示图像?

javascript - 使用自定义JavaScript验证扩展Coldfusion CFFORM验证