{"id":17221937,"url":"https://github.com/patternhelloworld/url-knife","last_synced_at":"2025-07-09T09:22:09.855Z","repository":{"id":34045166,"uuid":"166982500","full_name":"patternhelloworld/url-knife","owner":"patternhelloworld","description":"Extract and decompose (fuzzy) URLs (including emails, which are conceptually a part of URLs) in texts with Area-Pattern-based modularity","archived":false,"fork":false,"pushed_at":"2025-01-26T16:04:55.000Z","size":981,"stargazers_count":354,"open_issues_count":15,"forks_count":15,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-07-06T22:41:20.367Z","etag":null,"topics":["email-extractor","email-parser","email-parsing","pre-processing","uri-template","url-extractor","url-normalization","url-normalizer","url-parser","url-parsing","url-validation"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/patternhelloworld.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-01-22T11:29:16.000Z","updated_at":"2025-06-14T18:36:31.000Z","dependencies_parsed_at":"2025-06-09T13:44:23.243Z","dependency_job_id":"163e6076-e5a2-4c82-8b03-dfd34fc0feb3","html_url":"https://github.com/patternhelloworld/url-knife","commit_stats":null,"previous_names":["andrew-kang-g/parse-urls","patternknife/url-knife","andrew-kang-g/url-knife","patternhelloworld/url-knife","andrew-kang-g/pattern-dreamer"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/patternhelloworld/url-knife","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patternhelloworld%2Furl-knife","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patternhelloworld%2Furl-knife/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patternhelloworld%2Furl-knife/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patternhelloworld%2Furl-knife/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/patternhelloworld","download_url":"https://codeload.github.com/patternhelloworld/url-knife/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patternhelloworld%2Furl-knife/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264428892,"owners_count":23606716,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["email-extractor","email-parser","email-parsing","pre-processing","uri-template","url-extractor","url-normalization","url-normalizer","url-parser","url-parsing","url-validation"],"created_at":"2024-10-15T04:01:17.521Z","updated_at":"2025-07-09T09:22:09.850Z","avatar_url":"https://github.com/patternhelloworld.png","language":"TypeScript","funding_links":[],"categories":["JavaScript","TypeScript"],"sub_categories":[],"readme":"# Url-knife [![NPM version](https://img.shields.io/npm/v/url-knife.svg)](https://www.npmjs.com/package/url-knife) [![](https://data.jsdelivr.com/v1/package/gh/patternknife/url-knife/badge)](https://www.jsdelivr.com/package/gh/patternknife/url-knife) [![](https://badgen.net/bundlephobia/minzip/url-knife)](https://bundlephobia.com/result?p=url-knife)\n## Overview\nExtract and decompose (fuzzy) URLs (including emails, which are conceptually a part of URLs) in texts with ``Area-Pattern-based modularity``.\n- This library is currently being refactored into TypeScript, as it was originally developed in JavaScript. \n\n#### URL knife\n\u003ca href=\"https://jsfiddle.net/AndrewKang/xtfjn8g3/\" target=\"_blank\"\u003eLIVE DEMO\u003c/a\u003e\n\n\n## Area-Pattern-Based Modularity\n\nThe **Area** represents a designated section of content, such as general text, XML (HTML) areas, URL areas, or EMAIL areas. Each **Area** is associated with a specific set of **Patterns** (regular expressions) tailored to its context.\n\n### Example:\n\n1. In a **TextArea** (general plain text), the system applies a URL-specific regular expression to extract potential URLs.\n2. Once the area is narrowed down to contain URLs, **UrlArea** logic is used, applying URL-specific patterns to decompose the URL into its components (e.g., protocol, domain, path, query parameters).\n\n### Enhanced Accuracy with Regular Expression Indexes:\nTo further improve accuracy, the system leverages the **index** (or **offset**) values from regular expressions. These indexes help pinpoint exact locations of matches within the text, ensuring precise extraction and minimizing false positives.\n\nFor example:\n- If a **CommentArea** is processed using its specific patterns, the system identifies indexes for matches within that area.\n- These indexes can then be used to exclude matched URLs from a broader **TextArea**, ensuring only relevant URLs are processed and avoiding redundant or incorrect extractions.\n\n### Key Benefits:\nThis modular approach ensures that each **Area** is processed efficiently with the most relevant and optimized regular expressions. By incorporating index-based matching, it enables robust, scalable, and highly accurate parsing for various content types while preventing conflicts between overlapping patterns.\n\n\n## Installation\n\nFor ES5 users, refer to ``public/index.html``.\n\n``` html\n\u003chtml\u003e\n       \u003cbody\u003e\n       \t\u003cscript src=\"../dist/url-knife.bundle.js\"\u003e\u003c/script\u003e\n        \u003c--! OR !--\u003e\n       \t\u003cscript src=\"https://cdn.jsdelivr.net/gh/patternknife/url-knife@4.1.6/dist/url-knife.bundle.min.js\"\u003e\u003c/script\u003e \t\n       \u003c/body\u003e\n\u003c/html\u003e\n```\n\nFor ES6 npm users, run 'npm install --save url-knife' in the console.\n(**Requred Node v18.20.4**)\n``` html\nimport {TextArea, UrlArea, XmlArea} from 'url-knife';\n```\nFor ES5, add Pattern before usage:\n```javascript\nPattern.UrlArea...\n````\n\n## Syntax \u0026 Usage\n\n[Chapter 1. Normalize or parse one URL](#chapter-1-normalize-or-parse-one-url)\n\n[Chapter 2. Extract all URLs or emails](#chapter-2-extract-all-urls-or-emails)\n\n[Chapter 3. Extract URIs with certain names](#chapter-3-extract-uris-with-certain-names)\n\n[Chapter 4. Extract all URLs in raw HTML or XML](#chapter-4-extract-all-urls-in-raw-html-or-xml)\n\n\n#### Chapter 1. Normalize or parse one URL\nThe following two methods should be used for processing a single URL, not for multiple URLs within a text.\n(For handling multiple URLs, refer to Chapters 2 and 4.)\n\n##### normalizeUrl vs parseUrl\nIf you need to parse a standard URL without any typos, it is safe to use ``parseUrl``. However, ``normalizeUrl`` is designed to handle URLs that may contain human errors.\n\n* ##### Run ``normalizeUrl``\n  \n``` javascript\n/**\n* @brief\n* Normalize an url with potential human errors (Intranet urls are not allowed.)\n*/\nvar sample1 = Pattern.UrlArea.normalizeUrl(\"htp/:/abcgermany.,def;:9094 #park//noon??abc=retry\")\nvar sample2 = Pattern.UrlArea.normalizeUrl(\"'://abc.jppp:9091 /park/noon'\")\nvar sample3 = Pattern.UrlArea.normalizeUrl(\"ss hd : /university,.acd. ;jpkp: 9091/adc??abc=.com\")\n\n ```\n* ##### Results\n ``` javascript\n{\n  \"url\": \"htp/:/abcgermany.,def;:9094 #park//noon??abc=retry\",\n  \"normalizedUrl\": \"http://abcgermany.de:9094#park/noon?abc=retry\",\n  \"removedTailOnUrl\": \"\",\n  \"protocol\": \"http\",\n  \"onlyDomain\": \"abcgermany.de\",\n  \"onlyParams\": \"?abc=retry\",\n  \"onlyUri\": \"#park/noon\",\n  \"onlyUriWithParams\": \"#park/noon?abc=retry\",\n  \"onlyParamsJsn\": {\n    \"abc\": \"retry\"\n  },\n  \"type\": \"domain\",\n  \"port\": \"9094\"\n}\n{\n  \"url\": \"'://abc.jppp:9091 /park/noon'\",\n  \"normalizedUrl\": \"abc.jp:9091/park/noon\",\n  \"removedTailOnUrl\": \"'\",\n  \"protocol\": null,\n  \"onlyDomain\": \"abc.jp\",\n  \"onlyParams\": null,\n  \"onlyUri\": \"/park/noon'\",\n  \"onlyUriWithParams\": \"/park/noon'\",\n  \"onlyParamsJsn\": null,\n  \"type\": \"domain\",\n  \"port\": \"9091\"\n}\n{\n  \"url\": \"ss hd : /university,.acd. ;jpkp로 접속\",\n  \"normalizedUrl\": \"ssh://university.ac.jp\",\n  \"removedTailOnUrl\": \"\",\n  \"protocol\": \"ssh\",\n  \"onlyDomain\": \"university.ac.jp\",\n  \"onlyParams\": null,\n  \"onlyUri\": null,\n  \"onlyUriWithParams\": null,\n  \"onlyParamsJsn\": null,\n  \"type\": \"domain\",\n  \"port\": null\n}\n ``` \n\n* ##### Run ``parseUrl``\n\n``` javascript\n/**\n* @brief\n* Parse an url with no potential human errors\n*/\nvar url = Pattern.UrlArea.parseUrl(\"xtp://gooppalgo.com/park/tree/?abc=1\")\n ```\n ###### console.log() \n ``` javascript\n {\n  \"url\": \"xtp://gooppalgo.com/park/tree/?abc=1\",\n  \"removedTailOnUrl\": \"\",\n  \"protocol\": \"xtp (unknown protocol)\",\n  \"onlyDomain\": \"gooppalgo.com\",\n  \"onlyParams\": \"?abc=1\",\n  \"onlyUri\": \"/park/tree/\",\n  \"onlyUriWithParams\": \"/park/tree/?abc=1\",\n  \"onlyParamsJsn\": {\n    \"abc\": \"1\"\n  },\n  \"type\": \"domain\",\n  \"port\": null\n}\n ```\n \n #### Chapter 2. Extract all URLs or emails\n \n ##### The following methods are recommended to use in most cases.\n \n* ##### extractAllUrls\n \n ``` javascript\n     var textStr = 'http://[::1]:8000에서 http ://www.example.com/wpstyle/?p=364 is ok \\n' +\n         'HTTP://foo.com/blah_blah_(wikipedia) https://www.google.com/maps/place/USA/@36.2218457,... tnae1ver.com:8000on the internet  Asterisk\\n ' +\n         'the packed1book.net. fakeshouldnotbedetected.url?abc=fake s5houl７十七日dbedetected.jp?japan=go\u0026html=\u003cspan\u003e가나다@pacbook.net\u003c/span\u003e; abc.com/ad/fg/?kk=5 abc@daum.net' +\n         'Have you visited http://goasidaio.ac.kr?abd=5안녕하세요?5...,.\u0026kkk=5rk.,, ' +\n         'http://✪df.ws/123\\n' +\n         'http://142.42.1.1:8080/\\n' +\n         'http://-.~_!$\u0026\\'()*+,;=:%40:80%2f::::::@example.com ' +\n         'Have \u003cb\u003eyou\u003c/b\u003e visited goasidaio.ac.kr?abd=5hell0?5...\u0026kkk=5rk.,. ';\n  \n      /**\n       * @brief\n       * Distill all urls from normal text\n       * @author Andrew Kang\n       * @param textStr string required\n       * @param noProtocolJsn object\n       *    default :  {\n                  'ipV4' : false,\n                  'ipV6' : false,\n                  'localhost' : false,\n                  'intranet' : false\n              }\n        \n  var urls = Pattern.TextArea.extractAllUrls(textStr, {\n                     'ipV4' : true,\n                     'ipV6' : false,\n                     'localhost' : false,\n                     'intranet' : true\n })\n```\n\n* ##### extractAllEmails\n\n```\n        /**\n         * @brief\n         * Distill all emails from normal text\n         * @author Andrew Kang\n         * @param textStr string required\n         * @param prefixSanitizer boolean (default : false)\n         * @return array\n         */\n\n  var emails = Pattern.TextArea.extractAllEmails(textStr, true)\n\n  ```\n ###### console.log() \n ##### You may be wondering what the 'pass' property below means. If 'pass' is true, that is the email pattern is strictly true following RFC rules.\n```json\n [{\n    \"value\": {\n      \"email\": \"가나다@apacbook.ac.kr\",\n      \"removedTailOnEmail\": null,\n      \"type\": \"domain\"\n    },\n    \"area\": \"text\",\n    \"index\": {\n      \"start\": 222,\n      \"end\": 240\n    },\n    \"pass\": false\n  },\n  {\n    \"value\": {\n      \"email\": \"adssd@asdasd.ac.jp\",\n      \"removedTailOnEmail\": null,\n      \"type\": \"domain\",\n      \"removedTailOnUrl\": \"...\"\n    },\n    \"area\": \"text\",\n    \"index\": {\n      \"start\": 242,\n      \"end\": 263\n    },\n    \"pass\": true\n  }]\n```\n \u003ca href=\"https://jsfiddle.net/AndrewKang/xtfjn8g3/\" target=\"_blank\"\u003eLIVE DEMO\u003c/a\u003e\n \n#### Chapter 3. Extract URIs with certain names\n\n``` javascript\n\nvar sampleText = 'https://google.com/abc/777?a=5\u0026b=7 abc/def 333/kak abc/55에서 abc/53 abc/533/ka abc/53a/ka /123a/abc/556/dd /abc/123?a=5\u0026b=tkt /xyj/asff' +\n        'a333/kak  nice/guy/ bad/or/nice/guy ssh://nice.guy.com/?a=dkdfl';\n \n    /**\n     * @brief\n     * Distill uris with certain names from normal text\n     * @author Andrew Kang\n     * @param textStr string required\n     * @param uris array required\n     * for example, [['a','b'], ['c','d']]\n     * If you use {number}, this means 'only number' ex) [['a','{number}'], ['c','d']]\n     * @param endBoundary boolean (default : false)\n     * @return array\n     */ \n               \n var uris = Pattern.TextArea.extractCertainUris(sampleText,\n  [['{number}', 'kak'], ['nice','guy'],['abc', '{number}']], true)\n \n // 'If endBoundary is set to false, more uris are detected.'\n // This detects all URIs containing '{number}/kak' or nice/guy' or 'abc/{number}'\n ```\n ###### console.log() \n ``` javascript\n[\n  {\n    \"uriDetected\": {\n      \"value\": {\n        \"url\": \"/abc/777?a=5\u0026b=7\",\n        \"removedTailOnUrl\": \"\",\n        \"protocol\": null,\n        \"onlyDomain\": \"\",\n        \"onlyParams\": \"?a=5\u0026b=7\",\n        \"onlyUri\": \"/abc/777\",\n        \"onlyUriWithParams\": \"/abc/777?a=5\u0026b=7\",\n        \"onlyParamsJsn\": {\n          \"a\": \"5\",\n          \"b\": \"7\"\n        },\n        \"type\": \"domain\",\n        \"port\": null\n      },\n      \"area\": \"text\",\n      \"index\": {\n        \"start\": 18,\n        \"end\": 34\n      }\n    },\n    \"inWhatUrl\": {\n      \"value\": {\n        \"url\": \"https://google.com/abc/777?a=5\u0026b=7\",\n        \"removedTailOnUrl\": \"\",\n        \"protocol\": \"https\",\n        \"onlyDomain\": \"google.com\",\n        \"onlyParams\": \"?a=5\u0026b=7\",\n        \"onlyUri\": \"/abc/777\",\n        \"onlyUriWithParams\": \"/abc/777?a=5\u0026b=7\",\n        \"onlyParamsJsn\": {\n          \"a\": \"5\",\n          \"b\": \"7\"\n        },\n        \"type\": \"domain\",\n        \"port\": null\n      },\n      \"area\": \"text\",\n      \"index\": {\n        \"start\": 0,\n        \"end\": 34\n      }\n    }\n  },\n  {\n    \"uriDetected\": {\n      \"value\": {\n        \"url\": \"333/kak\",\n        \"removedTailOnUrl\": \"\",\n        \"protocol\": null,\n        \"onlyDomain\": null,\n        \"onlyParams\": null,\n        \"onlyUri\": \"333/kak\",\n        \"onlyUriWithParams\": \"333/kak\",\n        \"onlyParamsJsn\": null,\n        \"type\": \"uri\",\n        \"port\": null\n      },\n      \"area\": \"text\",\n      \"index\": {\n        \"start\": 43,\n        \"end\": 51\n      }\n    },\n    \"inWhatUrl\": undefined\n  },\n  {\n    \"uriDetected\": {\n      \"value\": {\n        \"url\": \"abc/53\",\n        \"removedTailOnUrl\": \"\",\n        \"protocol\": null,\n        \"onlyDomain\": null,\n        \"onlyParams\": null,\n        \"onlyUri\": \"abc/53\",\n        \"onlyUriWithParams\": \"abc/53\",\n        \"onlyParamsJsn\": null,\n        \"type\": \"uri\",\n        \"port\": null\n      },\n      \"area\": \"text\",\n      \"index\": {\n        \"start\": 60,\n        \"end\": 67\n      }\n    },\n    \"inWhatUrl\": undefined\n  },\n  {\n    \"uriDetected\": {\n      \"value\": {\n        \"url\": \"abc/533/ka\",\n        \"removedTailOnUrl\": \"\",\n        \"protocol\": null,\n        \"onlyDomain\": null,\n        \"onlyParams\": null,\n        \"onlyUri\": \"abc/533/ka\",\n        \"onlyUriWithParams\": \"abc/533/ka\",\n        \"onlyParamsJsn\": null,\n        \"type\": \"uri\",\n        \"port\": null\n      },\n      \"area\": \"text\",\n      \"index\": {\n        \"start\": 67,\n        \"end\": 77\n      }\n    },\n    \"inWhatUrl\": undefined\n  },\n  {\n    \"uriDetected\": {\n      \"value\": {\n        \"url\": \"/123a/abc/556/dd\",\n        \"removedTailOnUrl\": \"\",\n        \"protocol\": null,\n        \"onlyDomain\": null,\n        \"onlyParams\": null,\n        \"onlyUri\": \"/123a/abc/556/dd\",\n        \"onlyUriWithParams\": \"/123a/abc/556/dd\",\n        \"onlyParamsJsn\": null,\n        \"type\": \"uri\",\n        \"port\": null\n      },\n      \"area\": \"text\",\n      \"index\": {\n        \"start\": 89,\n        \"end\": 105\n      }\n    },\n    \"inWhatUrl\": undefined\n  },\n  {\n    \"uriDetected\": {\n      \"value\": {\n        \"url\": \"/abc/123?a=5\u0026b=tkt\",\n        \"removedTailOnUrl\": \"\",\n        \"protocol\": null,\n        \"onlyDomain\": null,\n        \"onlyParams\": \"?a=5\u0026b=tkt\",\n        \"onlyUri\": \"/abc/123\",\n        \"onlyUriWithParams\": \"/abc/123?a=5\u0026b=tkt\",\n        \"onlyParamsJsn\": {\n          \"a\": \"5\",\n          \"b\": \"tkt\"\n        },\n        \"type\": \"uri\",\n        \"port\": null\n      },\n      \"area\": \"text\",\n      \"index\": {\n        \"start\": 106,\n        \"end\": 124\n      }\n    },\n    \"inWhatUrl\": undefined\n  },\n  {\n    \"uriDetected\": {\n      \"value\": {\n        \"url\": \"nice/guy\",\n        \"removedTailOnUrl\": \"/\",\n        \"protocol\": null,\n        \"onlyDomain\": null,\n        \"onlyParams\": null,\n        \"onlyUri\": \"nice/guy\",\n        \"onlyUriWithParams\": \"nice/guy\",\n        \"onlyParamsJsn\": null,\n        \"type\": \"uri\",\n        \"port\": null\n      },\n      \"area\": \"text\",\n      \"index\": {\n        \"start\": 144,\n        \"end\": 153\n      }\n    },\n    \"inWhatUrl\": undefined\n  },\n  {\n    \"uriDetected\": {\n      \"value\": {\n        \"url\": \"/or/nice/guy\",\n        \"removedTailOnUrl\": \"\",\n        \"protocol\": null,\n        \"onlyDomain\": null,\n        \"onlyParams\": null,\n        \"onlyUri\": \"/or/nice/guy\",\n        \"onlyUriWithParams\": \"/or/nice/guy\",\n        \"onlyParamsJsn\": null,\n        \"type\": \"uri\",\n        \"port\": null\n      },\n      \"area\": \"text\",\n      \"index\": {\n        \"start\": 157,\n        \"end\": 170\n      }\n    },\n    \"inWhatUrl\": null\n  }\n]\n```\n\n#### Chapter 4. Extract all URLs in raw HTML or XML\n  \n``` javascript\n    // The sample of 'XML (HTML)'\nvar xmlStr =\n        'en.wikipedia.org/wiki/Wikipedia:About\\n' +\n        '\u003cbody\u003e\u003cp\u003epacked1book.net?user[name][first]=tj\u0026user[name][last]=holowaychuk\u003c/p\u003e\\n' +\n        'fakeshouldnotbedetected.url?abc=fake -s5houl７十七日dbedetected.jp?japan=go- ' +\n        'plus.google.co.kr0에서.., \\n' +\n        'https://plus.google.com/+google\\n' +\n        'https://www.google.com/maps/place/USA/@36.2218457,...' +\n        '\u003cimg style=\\' = \u003e float : none ; height: 200px;max-width: 50%;margin-top : 3%\\' alt=\"undefined\" src=\"http://www.aaa가가.com/image/showWorkOrderImg?fileName=12345.png\"/\u003e\\n' +\n        '\u003c!--how about adackedbooked.co.kr-the site?  请发邮件给我abc件给@navered.com ssh://www.aaa가.com\" \u003cp \u003e--邮件给aa件给@daum.net\u003c/p\u003e www.naver.com\\n  \u003cp style=\"width: 100%\"\u003e\u003c/p\u003e--\u003e  \"abc@daum.net\"로 보내주세요. ' +\n        '-gigi.dau.ac.kr?mac=10 -dau.ac.kr?mac=10 \u003cp id=\"abc\" class=\"def xxx gh\" style=\"\u003c\u003e\"\u003eabcd@daum.co.kr에서 가나다@pacbook.net\u003cspan style=\"color: rgb(127,127,127);\"\u003ePlease align the paper to the left.\u003c/span\u003e\u0026nbsp;\u003c/p\u003e\\n' +\n        '\u003cp\u003e 구루.com \u003cimg style=\"float:none;height: 200px;margin-top : 3%\" src=\"/image/showWorkOrderImg?fileName=123456.png\" alt=\"undefined\" abc/\u003e\u003c/p\u003e\\n' +\n        'http: //ne1ver.com:8000?abc=1\u0026dd=5 localhost:80 estonia.ee/ estonia.ee? \u003cp class=\"https://www.aadc给s.cn\"\u003e \thttps://flaviocopes.com/how-to-inspect-javascript-object/ ※Please ask 203.35.33.555:8000 if you have any issues! ※\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/p\u003e\u003c/body\u003e Have you visited goasidaioaaa.ac.kr';\n        \nvar urls = PatternExtractor.XmlArea.extractAllUrls(xmlStr);    \n```\n###### console.log()\n``` javascript\n [\n// Not all listed\n     {\n       \"value\": {\n         \"url\": \"packed1book.net?user[name][first]=tj\u0026user[name][last]=holowaychuk\",\n         \"removedTailOnUrl\": \"\",\n         \"protocol\": null,\n         \"onlyDomain\": \"packed1book.net\",\n         \"onlyParams\": \"?user[name][first]=tj\u0026user[name][last]=holowaychuk\",\n         \"onlyUri\": null,\n         \"onlyUriWithParams\": \"?user[name][first]=tj\u0026user[name][last]=holowaychuk\",\n         \"onlyParamsJsn\": {\n           \"user\": {\n             \"name\": {\n               \"first\": \"tj\",\n               \"last\": \"holowaychuk\"\n             }\n           }\n         },\n         \"type\": \"domain\",\n         \"port\": null\n       },\n       \"area\": \"text\"\n   },\n   {\n     \"value\": {\n       \"url\": \"adackedbooked.co.kr\",\n       \"removedTailOnUrl\": \"\",\n       \"protocol\": null,\n       \"onlyDomain\": \"adackedbooked.co.kr\",\n       \"onlyParams\": null,\n       \"onlyUri\": null,\n       \"onlyUriWithParams\": null,\n       \"onlyParamsJsn\": null,\n       \"type\": \"domain\",\n       \"port\": null\n     },\n     \"area\": \"comment\"\n   }\n    .....\n ]\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpatternhelloworld%2Furl-knife","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpatternhelloworld%2Furl-knife","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpatternhelloworld%2Furl-knife/lists"}