【问题标题】:How can I strip this URL of everything before "http://"?如何在“http://”之前删除此 URL 的所有内容?
【发布时间】:2011-06-17 21:53:58
【问题描述】:

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

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

希望您能提供帮助。

再次非常感谢。 迈克尔

【问题讨论】:

  • 那么,您当前的正则表达式是什么?
  • 您可能应该在“src”变量中查找所有文本。这将是一个简单的方法。
  • 大家好,感谢您的回复。我刚刚用我的相关功能更新了我的帖子。希望这有帮助吗?谢谢。
  • 好吧,我的逻辑错了。我应该早先使用 isValid() 函数来过滤掉格式错误的结果。无论如何谢谢!

标签: regex coldfusion railo


【解决方案1】:

看看 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。

【讨论】:

  • 谢谢。您的代码很有帮助,反过来又让我找到了解决问题的方法。你拿奖了!干杯:)
  • @Michael - 你也可以试试@Scott 的表达式reMatchNoCase()。它返回一个匹配的字符串数组。在涉及非捕获组之类的东西时,它并不总是像 reFind 那样好。但是试一试。
【解决方案2】:

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

【讨论】:

  • 是的,差不多就是这样,但相信我……我什至不知道该怎么做。 :(
  • 好吧 - 我帮不上什么忙,我对 ColdFusion 一无所知 :)
猜你喜欢
  • 2022-11-07
  • 1970-01-01
  • 2020-04-26
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多