Как я могу удалить этот URL всего до "http://"? - PullRequest
0 голосов
/ 18 июня 2011

Я занимаюсь веб-очисткой с 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>

Эта функцияна РАБОТАХ.Однако на некоторых сайтах это не так.Это выглядит немного неестественно, но во многом это всего лишь определенные меры предосторожности, чтобы убедиться, что я получаю действительные пути к изображениям.

Надеюсь, вы поможете.

Еще раз большое спасибо.Michael

Ответы [ 2 ]

4 голосов
/ 18 июня 2011

Взгляните на 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 голос
/ 18 июня 2011

Я не знаком с ColdFusion, но мне кажется, что вам просто нужно регулярное выражение, которое ищет http://,, затем любое количество символов, затем конец строки.

...