0

我正在使用 ColdFusion 进行一些网络抓取,并且大多数情况下一切正常。我得到的唯一其他问题是某些 URL 后面带有文本,现在导致错误。

不知道是什么原因造成的,但它可能是我的正则表达式。无论如何,文本出现在“http://”之前有一种独特的模式。我想简单地删除它之前的所有内容。

你有什么可以帮忙的机会吗?

以这个字符串为例:

"I'M OBSESSED WITH MY BEAUTIFUL FRIEND" src="http://scs.viceland.com/feed/images/uk_970014338_300.jpg

我非常感谢您的帮助,因为正则表达式不是我设法腾出时间的东西 - 希望有一天我会!

谢谢。

编辑:

你好,

我认为发布我的整个函数可能会有所帮助,因为它可能是我最初的 REGEX 导致了这个问题。基本上,该函数接受一个参数。在这种情况下,它是 HTML 文件的内容(通过 CFHTTP)。

在某些情况下,每个 URL 看起来都可以正常工作。例如,如果我尝试 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>

此功能有效。但是,在某些网站上,并非如此。它看起来有点过头,但其中大部分只是确保我获得有效图像路径的某些保护措施。

希望你能帮忙。

再次感谢。迈克尔

4

2 回答 2

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。

于 2011-06-17T22:15:14.177 回答
1

我不熟悉 ColdFusion,但在我看来,您只需要一个查找 http:// 的正则表达式,然后是任意数量的字符,然后是字符串的结尾。

于 2011-06-17T22:01:52.173 回答