2015-02-27 2 views
2

У меня есть один URL, который находится внутри <script> тега, и мне нужно, чтобы извлечь этот URL:Извлечение URL из SCRIPT части HTML код с RegEx

Использование ReMatchNoCase(), я могу найти скрипт и поместить его в массив.

<SCRIPT LANGUAGE="JavaScript" > //alert("a chance stuff"); document.location.href="https://mypage.cfm"; </SCRIPT> 

Чтобы извлечь URL, я использую следующий код

<cfset ulink = reMatchNoCase("<SCRIPT.*?>.*?</SCRIPT>", data)> 
<cfset link = Replacenocase(Replace(listLast(ulink[1],'='),'"','','ALL'),';</script>','','all')> 

Это работает, но есть более чистый способ сделать это?

ответ

1

Потому что ReFind/NoCase() не предназначен для возврата фактической подстроки, это примерно так же просто, как вы собираетесь получить.

<cfset data='<SCRIPT LANGUAGE="JavaScript" > //alert("a chance stuff"); document.location.href="https://mypage.cfm"; </SCRIPT>'> 
<cfset ulink = reMatchNoCase("<SCRIPT.*?>.*?</SCRIPT>", data)> 
<cfset link = Rematchnocase("http[^""']*",ulink[1])> 
<cfoutput>#link[1]#</cfoutput> 

Что немного проще, чем то, что вы делаете. В качестве альтернативы вы можете использовать Mid(ulink[1]...), но с подвыражениями от ReFindNoCase(), но это также не проще.

Регулярное выражение, которое я использую для сопоставления с URL-адресом, является очень общим, но оно должно легко выполнять задачу. Он просто захватывает все, пока не найдет цитату или апостроф.

Я также думаю, что этот

<cfset data='<SCRIPT LANGUAGE="JavaScript" > //alert("a chance stuff"); document.location.href="https://mypage.cfm"; </SCRIPT>'> 
<cfset ulink = rereplacenocase(data,"[\s\S]*?(<script.*?>[\s\S]*?(http[^""']*)[\s\S]*?</script>)[\s\S]*","\2","ALL")> 
<cfoutput>#ulink#</cfoutput> 

, который, возможно, лучше, но это так много неприятнее для чтения и является менее надежным для работы с несколькими <script> тегов, если это должно возникнуть.

Лично я бы пошел с первым маршрутом. С RegEx, иногда «ленивее», которым вы пытаетесь стать, темнее становится все это. Лучше всего определить лучший образец, который вы можете достичь, и в ColdFusion, я считаю, что первый маршрут - лучший маршрут.

+0

последний действительно работал thx –

0

Вы можете сделать следующее:

<cfset data = '<SCRIPT LANGUAGE="JavaScript" > //alert("a chance stuff"); document.location.href="https://mypage.cfm"; </SCRIPT>' /> 
<cfset start = REFindNoCase("<script[^>]*>", data) /> 
<cfset match = REMatchNoCase("https?://[^'""]*(?=.*</script>)(?!.*<script>)", mid(data, start, len(data) - start + 1)) /> 

Во второй строке я нахожу положение <script> открывающего тега (хотя и не абсолютно необходимых для этой конкретной части данных). В третьей строке я нахожу URL-адреса в теге <script>. Я использую положительный взгляд, чтобы убедиться, что есть конечный тег </script>, и отрицательный lookahead, чтобы убедиться, что нет другого <script> тега.

+0

, который также хорош один @David –

Смежные вопросы