문제

다음과 같은 기능이 필요합니다.

function isGoogleURL(url) { ... }

IFF URL은 Google에 속합니다. 잘못된 긍정이 없습니다. 잘못된 부정적인.

운 좋게도 있습니다 이것 참고로 :

.google.com .google.ad .google.ae .google.com.af. google.com.ag.ag.ai .google.am .google.it.ao .google.com.ar .google.as .google.at .google.com.au .google.az .google.ba .google.com.bd .google.be .google.bg .google.com.bh .google.bi .google.com.bn .google .com.bo.bo.br .google.bs .google.co.bw.bw .bw.bw .bz.bz .bz .google.ca .google.cd .google.cg .google.ch .google .ci .google.co.ck .google.cl .google.cn .google.com.co.google.co.cr .google.com.cu .google.cz .google.de .google.dj .google.dk .google.dm .google.com.do .google.dz .google.com.ec .google.ee .google.com.eg .google.es .google.com.et .google.fi .google.com.fj .google.fm .google.fr .google.ge .google.gg .google.com.gh .google.com.gi .google.gl.google.gm .google.gp .google.gr .google.com.gt .google.gy .google.com.hk .google.hn .google.hr .google.ht .google.hu .google.co.id .google.ie .google.co.il .google.im .google.co. .in .google.is .google.it .google.je .google.com.jm .google.jo .google.co.jp .google.co .ke .google.com.kh .google.ki .google.kg .google.co.kr .kr .kr .kr .kr .kr .kr .kz .kz .google.la .google.li .google.lk .google.co.ls .google.lt .google. .lu .google.lv .google.com.ly .google.co.ma .google.md .google.mn .google.ms .google.com.mt .google.mu .google.mv .google.mw .google .com.mx .google.com.my .google.co.mz .google.com.na .google.com.nf .google.com.ng .google.com.ni .google.nl .google.no .google. .com.np .google.nr .google.nu.google.co.nz .google.com.om .google.com.pa .google.com.pe .google.com.ph .google.com.pk .google .pl .google.pn .google.com.pr .google.pt .google.com.py .google.com.qa .google.ro .google.ru .google.rw .google.com.sa .google.com .sb .google.sc .google.se .google.com.sg .google.sh .google.si .google.sk .google.sn .google.sm .google.st .google.com.sv .google.co .th.google.com.tj .google.tk .google.tl .google.tm .google.to.google.com.tr .google.tt .google.com.tw .google.co.tz .google.com. .ua .google.co.ug .google.co.uk .google.com.uy .google.co.uz .google.com.vc .google.co.ve .goo gle.vg .google.co.vi .google.com.vn .google.vu .google.ws .google.rs .google.co.za .google.co.zm .google.co.zw .google.cat

우아하게하는 방법이 있습니까?

일부 설명 :

  • 나는 현재 google.com에서만 작동하는 Greasemonkey 스크립트에 대해 필요합니다 (그리고 다른 모든 TLD에도 효과가 있어야합니다). 여기 스크립트입니다 (Google 리더가 광범위한 화면에서 더 잘 작동하도록 수정합니다).
  • 위의 도메인에 속하는 URL에서 작동해야합니다 (Blogger.com 등).
도움이 되었습니까?

해결책

다음은 Prestaul의 답변에 대한 업데이트 된 버전입니다.

var GOOGLE_DOMAINS = ([
    '.google.com',
    '.google.ad',
    '.google.ae',
    '.google.com.af',
    '.google.com.ag',
    '.google.com.ai',
    '.google.am',
    '.google.it.ao',
    '.google.com.ar',
    '.google.as',
    '.google.at',
    '.google.com.au',
    '.google.az',
    '.google.ba',
    '.google.com.bd'
]).join('\n');

function isGoogleUrl(url) {
    // get the 2nd level domain from the url
    var domain = /^https?:\/\/[^\///]*(google\.[^\/\\]+)\//i.exec(url);
    if(!domain) return false;

    domain = '.'+domain[1];
    // create a regex to check to see if the domain is supported
    var re = new RegExp('^' + domain.replace(/\./g, '\\.') + '$', 'mi');
    return re.test(GOOGLE_DOMAINS);
}

alert(isGoogleUrl('http://www.google.ba/the/page.html')); // true
alert(isGoogleUrl('http://some_mal_site.com/http://www.google.ba/')); // false
alert(isGoogleUrl('https://google.com.au/')); // true
alert(isGoogleUrl('http://www.google.com.some_mal_site.com/')); // false
alert(isGoogleUrl('http://yahoo.com/')); // false

다른 팁

모든 도메인은 "Google.IT.AO"및 "Google.com"을 제외하고 "Google.xx", "Google.co.xx"또는 "Google.com.xx"로 끝납니다. 도메인,이 정규 표현식은 대부분의 경우에 작동해야합니다 (완벽하지는 않지만 나열된 모든 도메인을 받아들이고 "Google"을 포함하는 대부분의 다른 유효 도메인을 거부합니다).

/^(\w+\.)*google\.((com\.|co\.|it\.)?([a-z]{2})|com)$/i

함수로서 다음과 같이 할 수 있습니다.

function isGoogleUrl(url) {
    url = url.replace(/^https?:\/\//i, ''); // Strip "http://" from the beginning
    url = url.replace(/\/.*/, ''); // Strip off the path
    return /^(\w+\.)*google\.((com\.|co\.|it\.)?([a-z]{2})|com)$/i.test(url);
}

사용하면 단순화 할 수 있습니다 window.location.hostname:

function isGoogleUrl() {
    return /^(\w+\.)*google\.((com\.|co\.|it\.)?([a-z]{2})|com)$/i.test(window.location.hostname);
}

이것이 "Google. (일부 다른 TLD)"가있는 경우 잘못된 긍정적 인 것을 허용하는 유일한 방법입니다. 예를 들어 "Google.tv"는 목록에 있지 않지만 (Google.com으로 리디렉션) 통과합니다.

편집하다: Wimmel이 지적한 것처럼, 나열되지 않은 "Google.com.fr"과 같은 유효하지 않은 도메인도 허용합니다. 기본적으로 "Google. what what"도메인 이름을 허용합니다.

다른 Google 속성을 "Google에 소속"으로 계산합니까? 피드 버너, 블로거 등?

이것의 목적이 무엇인지 물어봐도 될까요? 당신이 원하는 것을하는 더 좋은 방법이있을 수 있습니다 ... 합리적이라면 내부적으로 당신에게 물어볼 수 있습니다.

테스트가 100% 정확하지 않으면이 간단한 정규식은 위에 게시 한 모든 도메인에 대해 다음과 같습니다.

"(http://)?([\w]+)?\.google\.([\w]{2,3})"

".google"의 존재를 테스트합니다. URL에 "Google"도메인을 추가하여 쉽게 속일 수 있지만 대부분의 경우 충분할 것입니다 (쉽지 않거나 신속하게 수행하지도 않습니다).

또는 Google이 자체 Google TLD를 구매할 때까지 기다리십시오.

나는 당신이 아마 이것을하지 말아야한다는 데 동의합니다 ... 그러나 만약 당신이 그것을하려고한다면 (그리고 당신은 Google과 같은 패턴을 확인하는 이전에 제공된 솔루션에 만족하지 않으면) 이것이 내가 어떻게 하든지 접근 :

var GOOGLE_DOMAINS = ([
    '.google.com',
    '.google.ad',
    '.google.ae',
    '.google.com.af',
    '.google.com.ag',
    '.google.com.ai',
    '.google.am',
    '.google.it.ao',
    '.google.com.ar',
    '.google.as',
    '.google.at',
    '.google.com.au',
    '.google.az',
    '.google.ba',
    '.google.com.bd'
]).join('\n');

function isGoogleUrl(url) {
    var url = 'http://www.google.ba/the/page.html';

    // get the domain from the url
    var domain = /\.google\.[^\/\\]+/i.exec(url) + '';
    if(!domain) return false;

    // create a regex to check to see if the domain is supported
    var re = new RegExp('^' + domain.replace(/\./g, '\\.') + '$', 'mi');
    return re.test(GOOGLE_DOMAINS);
}

이것은 URL 도메인을 기반으로 Regex를 생성하고이를 사용하여 도메인 목록을 테스트합니다.

참고 : GOOGLE_DOMAINS 변수는 게시 한 URL에서 반환 된 내용을 보유하는 문자열입니다. 도메인에서 그러한 요청을 할 수 없기 때문에 Ajax 또는 Iframe을 통해 해당 문자열을 검색 할 수있는 방법이 없습니다. 해당 목록을 검색하려면 하드 코드를 사용하거나 요청 서버 측을 만들어야합니다.

정기적 인 표현은 필요한 것일 수 있습니다. 예는 다음과 같습니다. 예는 다음과 같습니다. 예는 다음과 같습니다.

<script>
var elem = document.getElementById("a");
var regex = new RegExp("(http://)?(www\\.)?google\\.com");

elem.innerHTML = regex.test(elem.innerHTML);
</script>

이것은 스팬 요소 "a"의 내용을 얻을 수 있으며 Google.com이면 "true"로 변경하고 그렇지 않으면 "false"로 변경됩니다. 다른 모든 URL을 고려하지는 않지만 (Regex가 쉽게 수정할 수 있지만) "pages.google.com"은 일치하지 않습니다.

또한 URL에는 모두 ""가 있습니다. 그들 앞에 ( "google.com"대신 ". google.com"). 이것은 이유가 있습니까? 아니면 실수입니까?

당신은 같은 정규 표현을 사용할 수 있습니다 ....

^https?://[-A-Za-z0-9\.]+(\.google\.com|\.google\.ad|\.google\.ae|\.google\.com\.af|\.google\.com\.ag|\.google\.com\.ai|\.google\.am|\.google\.it\.ao|\.google\.com\.ar|\.google\.as|\.google\.at|\.google\.com\.au|\.google\.az|\.google\.ba|\.google\.com\.bd|\.google\.be|\.google\.bg|\.google\.com\.bh|\.google\.bi|\.google\.com\.bn|\.google\.com\.bo|\.google\.com\.br|\.google\.bs|\.google\.co\.bw|\.google\.com\.by|\.google\.com\.bz|\.google\.ca|\.google\.cd|\.google\.cg|\.google\.ch|\.google\.ci|\.google\.co\.ck|\.google\.cl|\.google\.cn|\.google\.com\.co|\.google\.co\.cr|\.google\.com\.cu|\.google\.cz|\.google\.de|\.google\.dj|\.google\.dk|\.google\.dm|\.google\.com\.do|\.google\.dz|\.google\.com\.ec|\.google\.ee|\.google\.com\.eg|\.google\.es|\.google\.com\.et|\.google\.fi|\.google\.com\.fj|\.google\.fm|\.google\.fr|\.google\.ge|\.google\.gg|\.google\.com\.gh|\.google\.com\.gi|\.google\.gl|\.google\.gm|\.google\.gp|\.google\.gr|\.google\.com\.gt|\.google\.gy|\.google\.com\.hk|\.google\.hn|\.google\.hr|\.google\.ht|\.google\.hu|\.google\.co\.id|\.google\.ie|\.google\.co\.il|\.google\.im|\.google\.co\.in|\.google\.is|\.google\.it|\.google\.je|\.google\.com\.jm|\.google\.jo|\.google\.co\.jp|\.google\.co\.ke|\.google\.com\.kh|\.google\.ki|\.google\.kg|\.google\.co\.kr|\.google\.kz|\.google\.la|\.google\.li|\.google\.lk|\.google\.co\.ls|\.google\.lt|\.google\.lu|\.google\.lv|\.google\.com\.ly|\.google\.co\.ma|\.google\.md|\.google\.mn|\.google\.ms|\.google\.com\.mt|\.google\.mu|\.google\.mv|\.google\.mw|\.google\.com\.mx|\.google\.com\.my|\.google\.co\.mz|\.google\.com\.na|\.google\.com\.nf|\.google\.com\.ng|\.google\.com\.ni|\.google\.nl|\.google\.no|\.google\.com\.np|\.google\.nr|\.google\.nu|\.google\.co\.nz|\.google\.com\.om|\.google\.com\.pa|\.google\.com\.pe|\.google\.com\.ph|\.google\.com\.pk|\.google\.pl|\.google\.pn|\.google\.com\.pr|\.google\.pt|\.google\.com\.py|\.google\.com\.qa|\.google\.ro|\.google\.ru|\.google\.rw|\.google\.com\.sa|\.google\.com\.sb|\.google\.sc|\.google\.se|\.google\.com\.sg|\.google\.sh|\.google\.si|\.google\.sk|\.google\.sn|\.google\.sm|\.google\.st|\.google\.com\.sv|\.google\.co\.th|\.google\.com\.tj|\.google\.tk|\.google\.tl|\.google\.tm|\.google\.to|\.google\.com\.tr|\.google\.tt|\.google\.com\.tw|\.google\.co\.tz|\.google\.com\.ua|\.google\.co\.ug|\.google\.co\.uk|\.google\.com\.uy|\.google\.co\.uz|\.google\.com\.vc|\.google\.co\.ve|\.google\.vg|\.google\.co\.vi|\.google\.com\.vn|\.google\.vu|\.google\.ws|\.google\.rs|\.google\.co\.za|\.google\.co\.zm|\.google\.co\.zw|\.google\.cat)

그리고 배열이나 다른 데이터 세트에서 JavaScript (또는 당신이 선택한 언어)로 생성하는 것은 비교적 쉽습니다.

나는이 클라이언트면을하지 않을 것이다.

Google 도메인 목록은 그렇게 자주 변경되지 않으므로 목록 서버 측면을 저장 한 다음 .js를 동적으로 생성하여 확인할 수 있습니다.

정규식이 각 TLD와 개별적으로 일치 할 수 없다면 실제로 '우아한 방법'은 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top