وظيفة جافا سكريبت إلى المباراة الوحيد Google Url

StackOverflow https://stackoverflow.com/questions/259751

  •  06-07-2019
  •  | 
  •  

سؤال

تحتاج وظيفة مثل:

function isGoogleURL(url) { ... }

التي ترجع صحيح المنتدى URL ينتمي إلى Google.لا ايجابيات كاذبة;لا السلبيات كاذبة.

لحسن الحظ هناك هذا كمرجع:

.google.com .google.الإعلانية .google.ae .google.com.af .google.com.ag .google.com.منظمة العفو الدولية .google.am .google.ذلك.آو .google.com.ar .google.كما .google.في .google.com.الاتحاد الافريقي .google.من الألف إلى الياء .google.با .google.com.دينار بحريني .google.يكون .google.bg .google.com.bh .google.ثنائية .google.com.مليار دولار .google.com.بو .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.تشيكوسلوفاكيا .google.de .google.dj .google.dk .google.dm .google.com.لا .google.dz .google.com.ec .google.ee .google.com.على سبيل المثال .google.es .google.com.وآخرون .google.فاي .google.com.fj .google.fm .google.fr .google.جنرال إلكتريك .google.زز .google.com.gh .google.com.gi .google.gl .google.جنرال موتورز .google.gp .google.gr .google.com.gt .google.غراي .google.com.hk .google.hn .google.الموارد البشرية .google.ht .google.هو جين تاو .google.co.id .google.ie .google.co.il .google.im .google.co.في .google.هو .google.ذلك .google.je .google.com.jm .google.جو .google.co.jp .google.co.كه .google.com.kh .google.كي .google.كجم .google.co.kr .google.kz .google.la .google.لى .google.lk .google.co.ls .google.lt .google.لو .google.lv .google.com.ly .google.co.ma .google.md .google.mn .google.مرض التصلب العصبي المتعدد .google.com.mt .google.مو .google.mv .google.mw .google.com.mx .google.com.بلدي .google.co.mz .google.com.نا .google.com.nf .google.com.ng .google.com.ني .google.nl .google.لا .google.com.np .google.nr .google.نو .google.co.نيوزيلندي .google.com.om .google.com.السلطة الفلسطينية .google.com.pe .google.com.ph .google.com.pk .google.pl .google.pn .google.com.العلاقات العامة .google.pt .google.com.py .google.com.qa .google.ريال عماني .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.ال .google.com.تي جي .google.المعارف التقليدية .google.tl .google.tm .google.إلى .google.com.tr .google.tt .google.com.tw .google.co.tz .google.com.ua .google.co.ug .google.co.المملكة المتحدة .google.com.أوي .google.co.uz .google.com.vc .google.co.ve .google.vg .google.co.السادس .google.com.vn .google.vu .google.ws .google.rs .google.co.za .google.co.zm .google.co.zw .google.القط

أي فكرة عن كيفية القيام بذلك أناقة ؟

بعض التوضيحات:

  • أحتاج هذا سكريبت كتبت حاليا يعمل فقط على google.com (ويجب العمل على كافة نطاقات Tld كذلك). هنا هو السيناريو (فمن يعدل قارئ جوجل للعمل على شاشات واسعة أفضل).
  • يجب أن تعمل على عناوين المواقع التي تنتمي إلى المجالات المذكورة أعلاه (لا blogger.com وما إلى ذلك).
هل كانت مفيدة؟

المحلول

إليك نسخة محدثة من إجابة بريستاول التي تحل المشكلتين اللتين ذكرتهما في التعليق هناك.

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.xx" أو "google.co.xx" أو "google.com.xx" باستثناء "google.it.ao" و"google.com"، لذلك إذا نظرت فقط إلى المجال، يجب أن يعمل هذا التعبير العادي في معظم الحالات (إنه ليس مثاليًا، ولكنه يقبل جميع النطاقات المدرجة، ويرفض معظم النطاقات الصالحة الأخرى التي تتضمن "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.whatever".

هل تعتبر خصائص Google الأخرى "مملوكة لشركة Google"؟فيدبورنر، مدون الخ؟

هل يمكنني أن أسأل ما هو الغرض من هذا؟ربما هناك طريقة أفضل لفعل ما تريد...وإذا كان الأمر معقولًا فيمكنني أن أطلب منك ذلك داخليًا.

إذا لم تكن تريد أن يكون الاختبار دقيقًا بنسبة 100%، فإن هذا التعبير العادي البسيط سيكون مناسبًا لجميع النطاقات التي نشرتها أعلاه:

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

مجرد اختبار وجود ".google". قد يكون كافيًا في معظم الحالات ، على الرغم من أنه يمكن خداعه بسهولة بإضافة مجال "Google" في عنوان URL (ليس بالأمر السهل ، ولا يتم القيام به بسرعة).

أو فقط انتظر حتى تقوم Google بشراء Google TLD الخاص بها.

أوافق على أنه ربما لا ينبغي عليك القيام بذلك ...ومع ذلك، إذا كنت ستفعل ذلك (ولم تكن راضيًا عن الحلول المقدمة مسبقًا والتي تبحث فقط عن نمط يشبه جوجل)، فهذه هي الطريقة التي سأتعامل بها مع الأمر:

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);
}

يؤدي هذا إلى إنشاء regex استنادًا إلى المجال الخاص بك بعنوان url ويستخدمه لاختبار قائمة النطاقات.

ملحوظة:ال 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>

هذا المحتوى من فترة العنصر "أ" و تغييره إلى "true" إذا google.com و "كاذبة" على خلاف ذلك.علما أنه لا ينظر في جميع عناوين url الأخرى(على الرغم من أن regex ويمكن بسهولة تعديل القيام بذلك) ، "pages.google.com" ، على سبيل المثال ، لن المباراة.

أيضا, عناوين المواقع الخاصة بك كل ما لديهم "." قبل لهم(".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 ديناميكيًا للتحقق منها.

بدون regex لمطابقة كل TLD بشكل فردي، لا توجد حقًا "طريقة أنيقة للقيام بذلك".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top