2012-04-17 2 views
3

Я пытаюсь написать код, который содержит URL-адрес, который содержит 3 части (www). (Domainname). (Com) и полностью обрезает первую часть.Значения обрезки Coldfusion-9

До сих пор у меня есть этот код, который проверяет, если на левой стороне, я не имею «WWW» или «Dev» пойти и установить siteDomainName = removecharsCGI.SERVER_NAME,1,2);

if (numHostParts eq 3 and listfindnocase('www,dev',left(CGI.SERVER_NAME,3)) eq 0) { 
     siteDomainName = removecharsCGI.SERVER_NAME,1,2); 

Проблема с выше код который удаляет только 2 символа, где мне нужно, чтобы удалить ВСЕ символы до numHostParts eq 2 или, по крайней мере, до первого «.».

Другой пример:

akjnakdn.example.com Мне нужен код, чтобы удалить первую часть URL с точкой включенную

Этот код поможет некоторые из запросов (akjnakdn.) что у меня есть на сайте, чтобы прекратить раздавить, потому что они связаны с # URL # и когда # URL # является поддельным, я получаю ошибку cform query returned zero records, из-за которой мои контактные формы перестают работать.

+0

Вы пытаетесь сделать каноническое доменное имя? –

+0

В качестве ответа в сторону запрос, возвращающий нулевые записи, является ожидаемым условием, которое необходимо обработать. Обычно это не должно вызывать ошибки. – Leigh

+0

Ну, он не возвращает ошибку пользователю, он возвращает сообщение о том, что форма не работает, но остальная часть сайта работает так, как должна. – Geo

ответ

4

Вы могли бы сделать что-то вроде этого:

<cfscript> 
    local.nameArr = ListToArray(CGI.SERVER_NAME, '.'); 
    if (ArrayLen(local.nameArr) gt 2) { 
     ArrayDeleteAt(local.nameArr, 1); 
    } 
    siteDomainName = ArrayToList(local.nameArr, '.'); 
</cfscript> 

Я расколоть имя сервера в элементы массива с периодом в качестве разделителя. Если число элементов больше двух, удалите первый элемент. Затем переведите его обратно в список с периодом в качестве разделителя.

UPDATE

Как было предложено Робб, это может быть более кратким и лучше, пропуская процесс преобразования массива:

<cfscript> 
    siteDomainName = CGI.SERVER_NAME; 
    if (ListLen(siteDomainName, '.') gt 2) { 
     siteDomainName = ListDeleteAt(siteDomainName, 1, '.'); 
    } 
</cfscript> 
+3

Я бы подошел к нему таким же образом, но вместо того, чтобы преобразовать его в массив, просто сделайте ListLen() и если его больше 2, ListDeleteAt() с помощью. в качестве разделителя –

+0

@RobbHartzog - Хороший вопрос, я обновил свое решение. –

+0

Работал второй код. Большое спасибо – Geo

6

Вы можете просто использовать listRest. Он возвращает все элементы в списке, кроме первого. Документация находится здесь http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-6d87.html

Пример:

<cfscript> 
name = cgi.server_name; 
if (listlen(name,".") gte 3) { 
    name = listRest(name,"."); 
} 
</cfscript> 
+0

Ну, есть функция, которую я не знал (или забыл). CF имел! –

+0

Это супер полезную функцию, а также список listFirst() и listLast() для списков синтаксического анализа, вы можете даже использовать listFirst() и listRest() для заголовка стиля журнала Prolog. Рекурсия хвоста. –

+0

Крысы ... I полностью забыл о listRest() - я использую последнее и первое все время ... спасибо за напоминание. –

0

Я хотел бы использовать регулярное выражение, так как вы только хотите «обрезать» определенные субдомены (www, dev).

<cfset the_domain = REReplaceNoCase(cgi.SERVER_NAME, "(www|dev)\.", "") /> 

Просто используйте | -delimited список поддоменов вы хотите обрезать в скобках.

+0

Я действительно хочу обрезать все из них, за исключением конкретного субдомена, который мне нужен. Например, теперь мой веб-сайт работает с тем, что когда-либо вы ставили перед доменным именем – Geo

+1

Я предпочитаю это решение, если были выделены только определенные префиксы. Тем не менее, OP также привел в качестве примера «akjnakdn.example.com». –

+0

Правда, регулярное выражение не упрощает кодирование исключений, а не включение. –

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