使用rereplace在cfhttp filecontent中查找字符串

时间:2015-01-15 20:04:31

标签: coldfusion

我正在使用cfhttp调用一个页面,此页面在此页面中有非常不同的详细信息,因为它使用脚本标记导航到下一页,我无法使用我的代码找到该内容:

这里的代码如下:

//window.location.replace("gen.asp?pagenum=-1" );
//window.location.replace("Wait.asp?Request("stateQ") & "&PDF=T" );
//window.location.replace("Gen.asp?stateQ=");
window.location.replace("GenA.asp?companyid=&stateQ=");

正如你在这里看到的那样有3个window.replace我希望获取一个未注释的那个并将https://添加到它,因为使用url它只显示404错误,因为它尝试附加我的https://url此文件无法找到,

我使用cfhttp作为:

<cfhttp method="get" url="#pstr#" charset="utf-8" result="objget"/>
<cfoutput>#objget.filecontent#</cfoutput>
<cfif rereplacenocase('^[window.location.replace]$')>

但不确定如何继续前进

2 个答案:

答案 0 :(得分:0)

我对你的目标非常困惑,但我觉得这样的事情会起作用。

您似乎正在尝试像ReFind一样使用ReReplace。我会告诉你:

<cfhttp method="get" url="#pstr#" charset="utf-8" result="objget"/>
<cfif ReFind("(GenA.asp\?companyid=(\d*)&stateQ=(\w*))",object.filecontent)>
  <cfset repcontent = ReReplaceNoCase(object.filecontent,"(GenA.asp\?companyid=(\d*)&stateQ=(\w*)","https://...stuff/\1","ALL")>
</cfif>

但是,在这种情况下不需要ReFind,如果rereplace无法匹配,则返回与替换之前相同的变量。 (ReFind()在您只想检查值是否存在的位置或while循环中是好的。)

<cfhttp method="get" url="#pstr#" charset="utf-8" result="objget"/>
<cfset repcontent = ReReplaceNoCase(object.filecontent,"(GenA.asp\?companyid=(\d*)&stateQ=(\w*)","https://...stuff/\1","ALL")>

这更有效,因为不需要if,因此没有性能开销。

两者都做了一些假设,但我不确定url是否为空值,因此无论价值如何,我都会告诉你如何进行替换。

  • (\d*)(作为公司ID的值)表示任意数量的数字,0或更多。如果它不是数值,则可以更改
  • (\w*)(因为stateQ的值意味着字母,数字或下划线,任意次。
  • 您会注意到问号的前缀是\。这不是拼写错误,问号是正则表达式中的特殊字符所以你必须逃避它。

假设值比这更复杂,因为你可以将它们更改为([^&]*),例如,这意味着“除了符号之外的任何字符,0次或更多次。”

<cfhttp method="get" url="#pstr#" charset="utf-8" result="objget"/>
<cfset repcontent = ReReplaceNoCase(object.filecontent,"(GenA.asp\?companyid=([^&]*)&stateQ=([^&]*)","https://...stuff/\1","ALL")>

或者,如果该值与您展示的一样,

<cfhttp method="get" url="#pstr#" charset="utf-8" result="objget"/>
<cfset repcontent = ReplaceNoCase(object.filecontent,"GenA.asp?companyid=&stateQ=","https://...stuff/GenA.asp?companyid=&stateQ=","ALL")>

答案 1 :(得分:0)

您希望在ColdFusion正则表达式中使用多行模式,以避免匹配以//注释开头的行,例如:

<cfset newcontent = REReplaceNoCase(objget.fileContent, "(?m)^(window\.location\.replace\("")(GenA\.asp\?companyid=&stateQ=)(""\);)$", "\1https://<myurl>/\2\3") />

请注意使用捕获组。第一组\1将捕获window.location.replace(";第二个\2您希望使用https://网址捕获和替换的网址;第三个\3 ");。起始锚^确保我们只抓取以window.location...开头的行,并避免那些被注释掉的行。多行模式参数(?m)允许这样做,因此锚点^$分别匹配行的开头和结尾,而不是字符串的开头和结尾。此参数的替代方法是使用Java正则表达式并使用负向lookbehind (?!<//)