我正在使用ColdFusion进行一些网络抓取,大多数情况下一切正常。我得到的唯一其他问题是,一些URL通过其背后的文本来实现,现在导致错误。
不确定是什么导致它,但它可能是我的正则表达式。无论如何,文本出现在“http://”之前有一个独特的模式。我想简单地删除之前的所有内容。
你有什么机会可以帮忙吗?
以此字符串为例:
"I'M OBSESSED WITH MY BEAUTIFUL FRIEND" src="http://scs.viceland.com/feed/images/uk_970014338_300.jpg
我非常感谢你的帮助,因为正则表达式不是我设法腾出时间的东西 - 希望有一天我会这样做!
感谢。
编辑:
您好,
我认为发布我的整个功能可能会有所帮助,因为它可能是导致问题的我的初始REGEX。基本上,函数有一个参数。在这种情况下,它是HTML文件的内容(通过CFHTTP)。
在某些情况下,每个网址看起来都很好。如果我尝试使用digg.com,它可以工作......但它会像youtube.com这样死掉。我想这将取决于他们特定的HTML格式。无论哪种方式,我所需要的只是图像标签上SRC属性的值。
这是我到目前为止所拥有的:
<cffunction name="extractImages" returntype="array" output="false" access="public" displayname="extractImages">
<cfargument name="fileContent" type="string" />
<cfset var local = {} />
<cfset local.images = [] />
<cfset local.imagePaths = [] />
<cfset local.temp = [] />
<cfset local.images = reMatchNoCase("<img([^>]*[^/]?)>", arguments.fileContent) />
<cfloop array="#local.images#" index="local.i">
<cfset local.temp = reMatchNoCase("(""|')(.*)(gif|jpg|jpeg|png)", local.i) />
<cfset local.path = local.temp />
<cfif not arrayIsEmpty(local.path)>
<cfset local.path = trim(replace(local.temp[1],"""","","all")) />
<cfset arrayAppend(local.imagePaths, local.path) />
</cfif>
<cfif isValid("url", local.path)>
<cftry>
<cfif fileExists(local.path)>
<cfset arrayAppend(local.imagePaths, local.path) />
</cfif>
<cfcatch type="any">
<cfset application.messagesObject.addMessage("error","We were not able to obtain all available images on this page.") />
</cfcatch>
</cftry>
</cfif>
</cfloop>
<cfset local.imagePaths = application.udfObject.removeArrayDuplicates(local.imagePaths) />
<cfreturn local.imagePaths />
</cffunction>
此功能可用。但是,在某些网站上,并非如此。它看起来有点过头,但其中很大一部分只是确保我获得有效图像路径的一些安全措施。
希望你能提供帮助。
再次感谢。 迈克尔
答案 0 :(得分:4)
看看ReFind()或REFindNoCase() - http://cfquickdocs.com/cf9/#refindnocase
这是一个可行的正则表达式。
<cfset string = 'IM OBSESSED WITH MY BEAUTIFUL FRIEND" src="http://scs.viceland.com/feed/images/uk_970014338_300.jpg' />
<cfdump var="#refindNoCase('https?://[-\w.]+(:\d+)?(/([\w/_.]*)?)?',string, 1, true)#">
您将看到一个带有POS和LEN键的结构。使用POS数组中的第一个元素查看匹配开始的位置,以及LEN数组中的第一个元素以查看它的长度。然后,您可以在Mid()函数中使用这些值来获取匹配的URL。
答案 1 :(得分:1)
我不熟悉ColdFusion,但在我看来,你只需要一个正则表达式来查找http://,然后是任意数量的字符,然后是字符串的结尾。