如何在“http://”之前删除所有内容的URL?

时间:2011-06-17 21:53:59

标签: regex coldfusion railo

我正在使用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>

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

希望你能提供帮助。

再次感谢。 迈克尔

2 个答案:

答案 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://,然后是任意数量的字符,然后是字符串的结尾。