Check if a JavaScript string is a URL

前端 未结 30 3550
野趣味
野趣味 2020-11-22 15:41

Is there a way in JavaScript to check if a string is a URL?

RegExes are excluded because the URL is most likely written like stackoverflow; that is to s

30条回答
  •  臣服心动
    2020-11-22 16:30

    This is defiantly not the most effective approach, but it is readable and easy to form to whatever you need. And it's easier to add regex/complexity from here. So here is a very pragmatic approach

    const validFirstBits = ["ftp://", "http://", "https://", "www."];
    const invalidPatterns = [" ", "//.", ".."];
    
    export function isUrl(word) {
    // less than www.1.dk
    if (!word || word.length < 8) return false;
    
    // Let's check and see, if our candidate starts with some of our valid first bits
    const firstBitIsValid = validFirstBits.some(bit => word.indexOf(bit) === 0);
    if (!firstBitIsValid) return false;
    
    const hasInvalidPatterns = invalidPatterns.some(
        pattern => word.indexOf(pattern) !== -1,
    );
    
    if (hasInvalidPatterns) return false;
    
    const dotSplit = word.split(".");
    if (dotSplit.length > 1) {
        const lastBit = dotSplit.pop(); // string or undefined
        if (!lastBit) return false;
        const length = lastBit.length;
        const lastBitIsValid =
            length > 1 || (length === 1 && !isNaN(parseInt(lastBit)));
        return !!lastBitIsValid;
    }
    
        return false;
    }
    

    TEST:

    import { isUrl } from "./foo";
    
    describe("Foo", () => {
        test("should validate correct urls correctly", function() {
            const validUrls = [
                "http://example.com",
                "http://example.com/blah",
                "http://127.0.0.1",
                "http://127.0.0.1/wow",
                "https://example.com",
                "https://example.com/blah",
                "https://127.0.0.1:1234",
                "ftp://example.com",
                "ftp://example.com/blah",
                "ftp://127.0.0.1",
                "www.example.com",
                "www.example.com/blah",
            ];
    
            validUrls.forEach(url => {
                expect(isUrl(url) && url).toEqual(url);
            });
        });
    
        test("should validate invalid urls correctly", function() {
            const inValidUrls = [
                "http:// foo.com",
                "http:/foo.com",
                "http://.foo.com",
                "http://foo..com",
                "http://.com",
                "http://foo",
                "http://foo.c",
            ];
    
            inValidUrls.forEach(url => {
                expect(!isUrl(url) && url).toEqual(url);
            });
        });
    });
    

提交回复
热议问题