【问题标题】:Parse the contents of a Coldfusion variable into separate variables将 Coldfusion 变量的内容解析为单独的变量
【发布时间】:2020-07-19 00:18:57
【问题描述】:

好的,所以我一直用头撞这个有一段时间了,但无济于事。我一直在尝试获取变量的内容并将包含的字符串解析为部分,然后将这些部分提取到 5 个单独的变量中。看起来很简单吧?好吧,至少对我来说,这根本不简单。

所以我有一个变量 (PageContent),其中包含来自 CFHTTP 请求的修剪内容。 PageContent 变量现在包含:

<tdnowrapalign=right>07/18/2020 13:00</td>
<tdalign=right>1002.12</td>
<tdalign=right>2,874,887</td>
<tdalign=right>12,766</td>
<tdalign=right>13,038</td>

似乎应该有一种简单的方法来编写一个循环,该循环将遍历“PageContent”变量中的标签,将每个标签的内容分配给不同的变量。但是,我尝试解析变量中的数据的每一种方式,我要么得到一个错误(复杂对象类型不能转换为简单值。)要么我最终得到了我最初在“PageContent”变量中的内容,在循环中重复.

例如,如果我有一个循环将运行 5 次迭代,并且可以获取将每个标记分配给变量的内容,那么所需的结果将是:

DateTime = "07/18/2020 13:00"
Elevation = "1002.12"
Storage = "2,874,887"
Outflow = "12,766"
Inflow = "13,038"

在尝试了我可以在这里和其他地方在线找到的每个示例之后,我现在正在进行第 100 次尝试。现在我正在尝试使用正则表达式来获取标签的内容并将它们分配给变量,但那里没有运气。我最终得到的是将 PageContent 变量的全部内容填充到每个变量中。结果并不出人意料,因为我不知道如何区分 3 个相同的“tdalign”标签,但似乎至少第一个变量会起作用,因为标签是不同的“tdnowrapalign”。

<cfset i=5/>
<cfloop index = "LoopCount" from = "1" to = #i#> 
    <cfif i EQ 1>
        <cfset dataDateTime = Replace(PageContent, "<[tdnowrapalign][^>]*>(.+?)</[td]>","","ALL")>
    <cfelseif i EQ 2>
        <cfset elevation = Replace(PageContent, "<[tdalign][^>]*>(.+?)</[td]>","","ALL")>
    <cfelseif i EQ 3>
        <cfset storage = Replace(PageContent, "<[tdalign][^>]*>(.+?)</[td]>","","ALL")>
    <cfelseif i EQ 4>
        <cfset outflow = Replace(PageContent, "<[tdalign][^>]*>(.+?)</[td]>","","ALL")>
    <cfelseif i EQ 5>
        <cfset inflow = Replace(PageContent, "<[tdalign][^>]*>(.+?)</[td]>","","ALL")>
    </cfif>

    <cfoutput>
    <cfif isdefined("dataDateTime")>
        dataDateTime = #dataDateTime#<br>
    </cfif>
    <cfif isdefined("elevation")>
        elevation = #elevation#<br>
    </cfif>
    <cfif isdefined("storage")>
        storage = #storage#<br>
    </cfif>
    <cfif isdefined("outflow")>
        outflow = #outflow#<br>
    </cfif>
    <cfif isdefined("inflow")>
        inflow = #inflow#<br>   
    </cfif>
    </cfoutput>

    <cfset i = i - 1> 

</cfloop>

有谁知道是否有办法达到我所描述的预期结果,其中我最终得到 5 个变量,其中包含“PageContent”变量中包含的标签的内容?

【问题讨论】:

  • 这是您要找的吗? bennadel.com/blog/…
  • 正则表达式或列表函数可能适用于这种特定情况,但可能会与其他情况发生冲突。特别是如果屏幕抓取易失性内容。如需更广泛的使用,请尝试 JSoup。

标签: regex parsing coldfusion


【解决方案1】:

一种方法是这样的

<cfset PageContent = '<tdnowrapalign=right>07/18/2020 13:00</td>
<tdalign=right>1002.12</td>
<tdalign=right>2,874,887</td>
<tdalign=right>12,766</td>
<tdalign=right>13,038</td>' />

<cfset data = ListToArray(PageContent, '</td>', false, true) />

<cfset DateTime = ListLast(data[1], '>') />
<cfset Elevation = ListLast(data[2], '>') />
<cfset Storage = ListLast(data[3], '>') />
<cfset Outflow = ListLast(data[4], '>') />
<cfset Inflow = ListLast(data[5], '>') />

演示:https://trycf.com/gist/b4f3b630bd1cbdc505d07a7d79b68ef5/acf?theme=monokai

【讨论】:

  • 是的,这正是我想要完成的。这很好用,而且非常简洁。我不确定你到底做了什么,但它看起来有点像我在访问反序列化 Json 中的节点或 XML 中的节点时使用的。我在那个描述中完全接近吗?非常感谢您抽出宝贵时间提供出色的解决方案。
  • 很高兴为您提供帮助。列表函数有时非常适合用于字符串。接下来,由于这些值看起来相关,如果您想让代码更优雅,您可以将它们分组到一个结构(键/值对)中。干杯。
猜你喜欢
  • 2015-05-14
  • 1970-01-01
  • 2014-05-11
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 2018-11-19
  • 2020-02-08
相关资源
最近更新 更多