<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Progragon Technolabs</title>
    <description>The latest articles on Forem by Progragon Technolabs (@progragon_technolabs).</description>
    <link>https://forem.com/progragon_technolabs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3871077%2F5c762d91-fb96-4a3e-ab3f-f71a2ae516bf.jpg</url>
      <title>Forem: Progragon Technolabs</title>
      <link>https://forem.com/progragon_technolabs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/progragon_technolabs"/>
    <language>en</language>
    <item>
      <title>URL Encoding Explained: What Every Developer Needs to Know (2026)</title>
      <dc:creator>Progragon Technolabs</dc:creator>
      <pubDate>Mon, 13 Apr 2026 06:23:52 +0000</pubDate>
      <link>https://forem.com/progragon_technolabs/url-encoding-explained-what-every-developer-needs-to-know-2026-4fe7</link>
      <guid>https://forem.com/progragon_technolabs/url-encoding-explained-what-every-developer-needs-to-know-2026-4fe7</guid>
      <description>&lt;p&gt;Ever wondered why your URLs have &lt;code&gt;%20&lt;/code&gt; instead of spaces, or why your API breaks when a parameter contains an &lt;code&gt;&amp;amp;&lt;/code&gt;? That's URL encoding at work — and understanding it will save you hours of debugging.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is URL Encoding?
&lt;/h2&gt;

&lt;p&gt;URL encoding (also called &lt;strong&gt;percent encoding&lt;/strong&gt;) converts characters into a format safe for URLs. Since URLs can only contain a limited set of ASCII characters, anything outside that set gets replaced with &lt;code&gt;%&lt;/code&gt; followed by two hex digits.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Space → &lt;code&gt;%20&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;amp;&lt;/code&gt; → &lt;code&gt;%26&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;=&lt;/code&gt; → &lt;code&gt;%3D&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#&lt;/code&gt; → &lt;code&gt;%23&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@&lt;/code&gt; → &lt;code&gt;%40&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;+&lt;/code&gt; → &lt;code&gt;%2B&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is defined in &lt;strong&gt;RFC 3986&lt;/strong&gt; and is fundamental to how the web works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why URL Encoding Matters
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Prevents Broken URLs
&lt;/h3&gt;

&lt;p&gt;Consider searching for "rock &amp;amp; roll":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ Bad:  https://api.example.com/search?q=rock &amp;amp; roll
✅ Good: https://api.example.com/search?q=rock%20%26%20roll
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without encoding, the &lt;code&gt;&amp;amp;&lt;/code&gt; is interpreted as a parameter separator, breaking your query into two malformed parameters.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Security
&lt;/h3&gt;

&lt;p&gt;Unencoded URLs are a vector for &lt;strong&gt;injection attacks&lt;/strong&gt; (XSS, SQL injection). Encoding neutralizes special characters by converting them to harmless percent-encoded representations.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. International Characters
&lt;/h3&gt;

&lt;p&gt;Non-ASCII characters (Chinese, Arabic, emoji) must be encoded using their UTF-8 byte sequences:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;café → caf%C3%A9
日本 → %E6%97%A5%E6%9C%AC
🚀  → %F0%9F%9A%80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Data Integrity
&lt;/h3&gt;

&lt;p&gt;URLs pass through proxies, load balancers, logging systems, and analytics tools. Encoding ensures nothing gets corrupted along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Percent Encoding Works
&lt;/h2&gt;

&lt;p&gt;The algorithm is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take the character's &lt;strong&gt;UTF-8 byte value&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Write &lt;code&gt;%&lt;/code&gt; + &lt;strong&gt;two hex digits&lt;/strong&gt; for each byte&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;ASCII characters (1 byte):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Character&lt;/th&gt;
&lt;th&gt;Decimal&lt;/th&gt;
&lt;th&gt;Hex&lt;/th&gt;
&lt;th&gt;Encoded&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Space&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%20&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;!&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%21&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%23&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;amp;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%26&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;+&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;2B&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%2B&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;2F&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%2F&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;3D&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%3D&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;?&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;3F&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%3F&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%40&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Multi-byte characters&lt;/strong&gt; produce multiple &lt;code&gt;%XX&lt;/code&gt; sequences:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;é (2 bytes UTF-8) → %C3%A9
中 (3 bytes UTF-8) → %E4%B8%AD
🎉 (4 bytes UTF-8) → %F0%9F%8E%89
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Three Categories of Characters
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Unreserved (Never need encoding)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A-Z  a-z  0-9  -  .  _  ~
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are always safe in any URL position.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Reserved (Encode when used as data)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:  /  ?  #  [  ]  @  !  $  &amp;amp;  '  (  )  *  +  ,  ;  =
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These have special meaning in URLs. Encode them when they appear as &lt;strong&gt;data&lt;/strong&gt; (parameter values), not when they serve their &lt;strong&gt;structural purpose&lt;/strong&gt; (delimiters).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Everything Else (Always encode)
&lt;/h3&gt;

&lt;p&gt;Spaces, non-ASCII characters, control characters — always encode these.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Space Encoding Confusion
&lt;/h2&gt;

&lt;p&gt;Spaces can be encoded &lt;strong&gt;two ways&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Context&lt;/th&gt;
&lt;th&gt;Encoding&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Path segments&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%20&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/my%20file.txt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Query strings&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;+&lt;/code&gt; or &lt;code&gt;%20&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;?q=hello+world&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;+&lt;/code&gt; convention comes from HTML form submissions (&lt;code&gt;application/x-www-form-urlencoded&lt;/code&gt;). Outside query strings, always use &lt;code&gt;%20&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This dual convention is the #1 source of URL encoding bugs.&lt;/strong&gt; 🐛&lt;/p&gt;

&lt;h2&gt;
  
  
  URL Encoding in JavaScript
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Encode a parameter value (most common)&lt;/span&gt;
&lt;span class="nf"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rock &amp;amp; roll&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// → "rock%20%26%20roll"&lt;/span&gt;

&lt;span class="c1"&gt;// Encode a full URL (preserves structure)&lt;/span&gt;
&lt;span class="nf"&gt;encodeURI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com/path?q=hello world&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// → "https://example.com/path?q=hello%20world"&lt;/span&gt;

&lt;span class="c1"&gt;// Decode&lt;/span&gt;
&lt;span class="nf"&gt;decodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rock%20%26%20roll&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// → "rock &amp;amp; roll"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rule of thumb:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;encodeURIComponent()&lt;/code&gt; for &lt;strong&gt;parameter values&lt;/strong&gt; (99% of cases)&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;encodeURI()&lt;/code&gt; for &lt;strong&gt;complete URLs&lt;/strong&gt; (rare)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  URL Encoding in Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib.parse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quote_plus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urlencode&lt;/span&gt;

&lt;span class="c1"&gt;# For path segments
&lt;/span&gt;&lt;span class="nf"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my file.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → "my%20file.txt"
&lt;/span&gt;
&lt;span class="c1"&gt;# For query string values (spaces → +)
&lt;/span&gt;&lt;span class="nf"&gt;quote_plus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rock &amp;amp; roll&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → "rock+%26+roll"
&lt;/span&gt;
&lt;span class="c1"&gt;# Build a complete query string
&lt;/span&gt;&lt;span class="nf"&gt;urlencode&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rock &amp;amp; roll&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;page&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="c1"&gt;# → "q=rock+%26+roll&amp;amp;page=1"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  URL Encoding in PHP
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Spaces → + (form encoding)&lt;/span&gt;
&lt;span class="nb"&gt;urlencode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"rock &amp;amp; roll"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// → "rock+%26+roll"&lt;/span&gt;

&lt;span class="c1"&gt;// Spaces → %20 (RFC 3986)&lt;/span&gt;
&lt;span class="nb"&gt;rawurlencode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"rock &amp;amp; roll"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// → "rock%20%26%20roll"&lt;/span&gt;

&lt;span class="c1"&gt;// Build query string from array&lt;/span&gt;
&lt;span class="nb"&gt;http_build_query&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;"q"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"rock &amp;amp; roll"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"page"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="c1"&gt;// → "q=rock+%26+roll&amp;amp;page=1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  URL Encoding vs HTML Encoding
&lt;/h2&gt;

&lt;p&gt;These are &lt;strong&gt;completely different&lt;/strong&gt; — don't confuse them!&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;URL Encoding&lt;/th&gt;
&lt;th&gt;HTML Encoding&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Safe URLs&lt;/td&gt;
&lt;td&gt;Safe HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Format&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%XX&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;amp;entity;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Space&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%20&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;amp;nbsp;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&amp;amp;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%26&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;amp;amp;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&amp;lt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%3C&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;amp;lt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;When&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Building URLs&lt;/td&gt;
&lt;td&gt;Rendering HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Security tip:&lt;/strong&gt; When embedding a URL in an HTML attribute (like &lt;code&gt;href&lt;/code&gt;), you need &lt;strong&gt;both&lt;/strong&gt; encodings — URL-encode the data first, then HTML-encode the complete URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common URL Encoding Bugs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Bug #1: Double encoding
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ %2520 (the % in %20 got encoded again)
✅ %20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This happens when you encode an already-encoded URL. Always encode &lt;strong&gt;raw data&lt;/strong&gt;, never encoded strings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bug #2: Using encodeURI instead of encodeURIComponent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Wrong — doesn't encode &amp;amp; and =&lt;/span&gt;
&lt;span class="nf"&gt;encodeURI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;key=value&amp;amp;foo=bar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// → "key=value&amp;amp;foo=bar" (unchanged!)&lt;/span&gt;

&lt;span class="c1"&gt;// Right — encodes everything&lt;/span&gt;
&lt;span class="nf"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;key=value&amp;amp;foo=bar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// → "key%3Dvalue%26foo%3Dbar"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Bug #3: Not encoding at all
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This WILL break if query contains &amp;amp; or =&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://api.com/search?q=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Always encode user input&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://api.com/search?q=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Try It Yourself 🚀
&lt;/h2&gt;

&lt;p&gt;I built a free &lt;strong&gt;URL Parser&lt;/strong&gt; that breaks down any URL into its components — protocol, hostname, path, query parameters, and fragment. Perfect for debugging encoded URLs:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://stringtoolsapp.com/url-parser" rel="noopener noreferrer"&gt;StringToolsApp URL Parser&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste any URL and instantly see every component decoded and separated. 100% client-side — nothing leaves your browser.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;URL encoding is one of those web fundamentals that's easy to ignore until it causes a production bug. Remember these rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Always use &lt;code&gt;encodeURIComponent()&lt;/code&gt;&lt;/strong&gt; for parameter values&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never encode an already-encoded string&lt;/strong&gt; (double encoding)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spaces: &lt;code&gt;%20&lt;/code&gt; in paths, &lt;code&gt;+&lt;/code&gt; or &lt;code&gt;%20&lt;/code&gt; in query strings&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL encoding ≠ HTML encoding&lt;/strong&gt; — different contexts, different rules&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bookmark this guide and you'll never have a URL encoding bug again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the worst URL encoding bug you've encountered?&lt;/strong&gt; Share in the comments! 💬&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Markdown Cheat Sheet: Complete Syntax Guide with Examples (2026)</title>
      <dc:creator>Progragon Technolabs</dc:creator>
      <pubDate>Mon, 13 Apr 2026 04:56:09 +0000</pubDate>
      <link>https://forem.com/progragon_technolabs/markdown-cheat-sheet-complete-syntax-guide-with-examples-2026-50j1</link>
      <guid>https://forem.com/progragon_technolabs/markdown-cheat-sheet-complete-syntax-guide-with-examples-2026-50j1</guid>
      <description>&lt;p&gt;Markdown is everywhere — GitHub READMEs, documentation, blog posts, Discord, Reddit, Notion, and more. Yet many developers only know the basics. This complete cheat sheet covers everything from headings to advanced features like footnotes, task lists, and diagrams.&lt;/p&gt;

&lt;p&gt;Bookmark this for reference — you'll use it every day. 📌&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Markdown?
&lt;/h2&gt;

&lt;p&gt;Markdown is a lightweight markup language created by John Gruber in 2004. The philosophy: raw text should be readable as-is, with formatting syntax serving as natural visual cues rather than distracting code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it's used:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub / GitLab (READMEs, Issues, PRs, Wikis)&lt;/li&gt;
&lt;li&gt;Stack Overflow, Reddit, Discord&lt;/li&gt;
&lt;li&gt;Notion, Obsidian, Typora&lt;/li&gt;
&lt;li&gt;Blog platforms (Dev.to, Hashnode, Ghost)&lt;/li&gt;
&lt;li&gt;API documentation (Swagger, Docusaurus)&lt;/li&gt;
&lt;li&gt;Jupyter notebooks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;File extensions:&lt;/strong&gt; &lt;code&gt;.md&lt;/code&gt; or &lt;code&gt;.markdown&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Headings
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Heading 1&lt;/span&gt;
&lt;span class="gu"&gt;## Heading 2&lt;/span&gt;
&lt;span class="gu"&gt;### Heading 3&lt;/span&gt;
&lt;span class="gu"&gt;#### Heading 4&lt;/span&gt;
&lt;span class="gu"&gt;##### Heading 5&lt;/span&gt;
&lt;span class="gu"&gt;###### Heading 6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt; Always put a space after the &lt;code&gt;#&lt;/code&gt;. Use headings to create structure — don't skip levels (e.g., don't jump from H2 to H4).&lt;/p&gt;




&lt;h2&gt;
  
  
  Text Formatting
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gs"&gt;**bold text**&lt;/span&gt;
&lt;span class="ge"&gt;*italic text*&lt;/span&gt;
&lt;span class="gs"&gt;***bold and italic**&lt;/span&gt;&lt;span class="err"&gt;*&lt;/span&gt;
~~strikethrough~~
&lt;span class="sb"&gt;`inline code`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Renders as:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;bold text&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;italic text&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;bold and italic&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;strikethrough&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;inline code&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; Use &lt;code&gt;**asterisks**&lt;/code&gt; for bold, not &lt;code&gt;__underscores__&lt;/code&gt;. Asterisks work consistently everywhere — underscores can break mid-word in some parsers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Inline link&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Link with title&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com&lt;/span&gt; &lt;span class="nn"&gt;"Hover text"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Reference link&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="sx"&gt;https://example.com&lt;/span&gt; &lt;span class="nn"&gt;"Reference definition"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Auto-linking:&lt;/strong&gt; On GitHub and Dev.to, bare URLs like &lt;code&gt;https://example.com&lt;/code&gt; become clickable automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Images
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Alt text&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com/image.png&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Alt text&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com/image.png&lt;/span&gt; &lt;span class="nn"&gt;"Optional title"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Markdown doesn't support image sizing natively. For custom dimensions, use HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"image.png"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"400"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Lists
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Unordered
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; Item one
&lt;span class="p"&gt;-&lt;/span&gt; Item two
&lt;span class="p"&gt;  -&lt;/span&gt; Nested item
&lt;span class="p"&gt;  -&lt;/span&gt; Another nested
&lt;span class="p"&gt;-&lt;/span&gt; Item three
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ordered
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;1.&lt;/span&gt; First item
&lt;span class="p"&gt;2.&lt;/span&gt; Second item
&lt;span class="p"&gt;3.&lt;/span&gt; Third item
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fun fact:&lt;/strong&gt; The actual numbers don't matter. You can write all &lt;code&gt;1.&lt;/code&gt; and the renderer will still number them correctly. This makes it easy to insert items without renumbering.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task Lists (GitHub Flavored)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; [x] Completed task
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Incomplete task
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Another task
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Renders as interactive checkboxes on GitHub! ✅&lt;/p&gt;




&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Inline Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Use &lt;span class="sb"&gt;`console.log()`&lt;/span&gt; to debug.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fenced Code Block (with syntax highlighting)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;
&lt;/span&gt;
javascript
function greet(name) {
  return `Hello, ${name}!`;
}


&lt;span class="p"&gt;```&lt;/span&gt;
&lt;span class="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;
&lt;/span&gt;
`

**Supported languages:** `javascript`, `python`, `typescript`, `html`, `css`, `json`, `bash`, `sql`, `go`, `rust`, `java`, `ruby`, `php`, `c`, `cpp`, `swift`, `kotlin`, and many more.

**Always specify the language** — syntax highlighting makes code dramatically easier to read.

---

## Blockquotes

```markdown
&amp;gt; This is a blockquote.
&amp;gt; It can span multiple lines.

&amp;gt; You can also
&amp;gt;&amp;gt; nest blockquotes
&amp;gt;&amp;gt;&amp;gt; multiple levels deep
```

### GitHub Alert Callouts

```markdown
&amp;gt; [!NOTE]
&amp;gt; This is a note callout.

&amp;gt; [!TIP]
&amp;gt; Helpful advice for the reader.

&amp;gt; [!WARNING]
&amp;gt; Something to be careful about.

&amp;gt; [!CAUTION]
&amp;gt; Potential danger or critical issue.
```

These render with colored icons on GitHub — incredibly useful for documentation! 🎨

---

## Tables

```markdown
| Feature | JSON | XML |
|---------|------|-----|
| Syntax  | Clean | Verbose |
| Speed   | Fast | Slower |
| Types   | Yes  | No |
```

### Column Alignment

```markdown
| Left | Center | Right |
|:-----|:------:|------:|
| L    | C      | R     |
```

- `:---` = left align
- `:---:` = center align
- `---:` = right align

---

## Horizontal Rules

```markdown
---
***
___
```

All three produce the same horizontal line. Use `---` (most common convention).

---

## Escaping Special Characters

```markdown
\* Not italic \*
\# Not a heading
\[Not a link\]
\`Not code\`
```

Prefix any Markdown special character with `\` to render it literally.

---

## Advanced Features

### Footnotes

```markdown
Here's a statement with a footnote.[^1]

[^1]: This is the footnote content.
```

Supported on Dev.to, GitHub (in some contexts), and many static site generators.

### Definition Lists

```markdown
Term
: Definition of the term

Another Term
: Another definition
```

### Math (LaTeX)

```markdown
Inline: $E = mc^2$

Block:
$$
\sum_{i=1}^{n} x_i = x_1 + x_2 + ... + x_n
$$
```

Supported on GitHub, Jupyter, and platforms using MathJax/KaTeX.

### Mermaid Diagrams (GitHub)

`

&lt;span class="p"&gt;```&lt;/span&gt;markdown
&lt;span class="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;
&lt;/span&gt;
mermaid
graph LR
    A[Start] --&amp;gt; B{Decision}
    B --&amp;gt;|Yes| C[Do this]
    B --&amp;gt;|No| D[Do that]


&lt;span class="p"&gt;```&lt;/span&gt;
&lt;span class="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;
&lt;/span&gt;
`

GitHub renders these as interactive diagrams directly in your Markdown! Perfect for flowcharts, sequence diagrams, and architecture docs.

---

## Quick Reference Table

| Element | Syntax |
|---------|--------|
| Heading | `# H1` `## H2` `### H3` |
| Bold | `**text**` |
| Italic | `*text*` |
| Strikethrough | `~~text~~` |
| Link | `[text](url)` |
| Image | `![alt](url)` |
| Inline code | `` `code` `` |
| Code block | `

&lt;span class="p"&gt;```&lt;/span&gt; &lt;span class="sb"&gt;```

 lang 

```&lt;/span&gt;

&lt;span class="sb"&gt;` |
| Blockquote | `&lt;/span&gt;&amp;gt; text&lt;span class="sb"&gt;` |
| Unordered list | `&lt;/span&gt;- item&lt;span class="sb"&gt;` |
| Ordered list | `&lt;/span&gt;1. item&lt;span class="sb"&gt;` |
| Task list | `&lt;/span&gt;- [x] done&lt;span class="sb"&gt;` |
| Table | `&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt; col &lt;span class="se"&gt;\|&lt;/span&gt; col &lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="sb"&gt;` |
| Horizontal rule | `&lt;/span&gt;---&lt;span class="sb"&gt;` |
| Footnote | `&lt;/span&gt;[^1]&lt;span class="sb"&gt;` |

---

## Try It Yourself 🚀

I built a free **Markdown Preview** tool with a live editor, formatting toolbar, and instant HTML rendering — no signup needed:

👉 [StringToolsApp Markdown Preview](https://stringtoolsapp.com/markdown-preview)

Write Markdown on the left, see the rendered output on the right. Copy the HTML with one click. 100% client-side — nothing leaves your browser.

---

## Conclusion

Markdown is one of those skills that takes 10 minutes to learn but saves you thousands of hours over your career. Bookmark this cheat sheet and refer to it whenever you forget a syntax.

**What's your favorite Markdown feature?** Are you team `&lt;/span&gt;&lt;span class="gs"&gt;**asterisks**&lt;/span&gt;&lt;span class="sb"&gt;` or `&lt;/span&gt;__underscores__&lt;span class="err"&gt;`&lt;/span&gt; for bold? Drop a comment! 💬
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>markdown</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>JWT Tokens Explained: How to Read and Debug JSON Web Tokens (2026)</title>
      <dc:creator>Progragon Technolabs</dc:creator>
      <pubDate>Fri, 10 Apr 2026 12:26:36 +0000</pubDate>
      <link>https://forem.com/progragon_technolabs/jwt-tokens-explained-how-to-read-and-debug-json-web-tokens-2026-3eei</link>
      <guid>https://forem.com/progragon_technolabs/jwt-tokens-explained-how-to-read-and-debug-json-web-tokens-2026-3eei</guid>
      <description>&lt;p&gt;JSON Web Tokens (JWTs) power authentication in almost every modern web application — from small startups to enterprise systems. Yet many developers use JWTs daily without fully understanding how they work, how to debug them, or how to secure them properly. This guide covers everything you need to know about JWT tokens in 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a JWT Token?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;JSON Web Token&lt;/strong&gt; (JWT, pronounced "jot") is a compact, URL-safe token format used to represent claims securely between two parties. Defined in &lt;strong&gt;RFC 7519&lt;/strong&gt;, JWTs have become the dominant mechanism for authentication and authorization in modern web applications and APIs.&lt;/p&gt;

&lt;p&gt;Unlike opaque session tokens that require a server-side lookup, JWTs are &lt;strong&gt;self-contained&lt;/strong&gt;: they carry all necessary information within the token itself, encoded as a JSON object. This stateless property makes JWTs particularly well-suited for distributed systems and microservice architectures.&lt;/p&gt;

&lt;p&gt;A typical JWT looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNzA5MjUxMjAwfQ.dGhpc19pc19hX2Zha2Vfc2lnbmF0dXJl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That seemingly random string is actually three distinct parts separated by dots. Let's break it down.&lt;/p&gt;

&lt;h2&gt;
  
  
  JWT Structure: Header, Payload, and Signature
&lt;/h2&gt;

&lt;p&gt;Every JWT consists of &lt;strong&gt;three parts&lt;/strong&gt; separated by dots:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xxxxx.yyyyy.zzzzz
 |      |      |
header  payload  signature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each part is &lt;strong&gt;Base64URL-encoded&lt;/strong&gt; independently, then concatenated with dots.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Header
&lt;/h3&gt;

&lt;p&gt;The header describes the token type and signing algorithm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"alg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HS256"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"typ"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JWT"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;alg&lt;/code&gt; — the algorithm (HS256, RS256, ES256, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;typ&lt;/code&gt; — always "JWT"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kid&lt;/code&gt; — (optional) key identifier for key rotation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Payload
&lt;/h3&gt;

&lt;p&gt;The payload contains &lt;strong&gt;claims&lt;/strong&gt; — statements about the user and metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sub"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1234567890"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"alice@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"admin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"iat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1709251200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1709254800&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claims come in three categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Registered claims&lt;/strong&gt; — Standard names like &lt;code&gt;iss&lt;/code&gt; (issuer), &lt;code&gt;exp&lt;/code&gt; (expiration), &lt;code&gt;sub&lt;/code&gt; (subject), &lt;code&gt;aud&lt;/code&gt; (audience)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public claims&lt;/strong&gt; — Application-defined, should use collision-resistant names&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private claims&lt;/strong&gt; — Custom fields agreed between issuer and consumer&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Signature
&lt;/h3&gt;

&lt;p&gt;The signature is created by signing the encoded header and payload with a secret key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nc"&gt;HMACSHA256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;base64UrlEncode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;base64UrlEncode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;secret&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures the token hasn't been tampered with. Changing a single character invalidates the signature.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Important:&lt;/strong&gt; JWTs are &lt;strong&gt;encoded&lt;/strong&gt;, not &lt;strong&gt;encrypted&lt;/strong&gt;. Anyone can decode and read a JWT. The security comes from the signature proving authenticity — not from hiding the contents.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How JWT Authentication Works
&lt;/h2&gt;

&lt;p&gt;Here's the typical JWT authentication flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. User submits credentials (username/password)
   ↓
2. Server verifies credentials
   ↓
3. Server creates JWT with user claims
   ↓
4. Server signs JWT with secret key
   ↓
5. Client stores JWT (memory or HTTP-only cookie)
   ↓
6. Client sends JWT in Authorization header on every request
   ↓
7. Server verifies signature and claims
   ↓
8. Server processes request with user info from claims
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example Request
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;GET&lt;/span&gt; &lt;span class="nn"&gt;/api/user/profile&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api.example.com&lt;/span&gt;
&lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWI...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Server Verification Steps
&lt;/h3&gt;

&lt;p&gt;For each request, the server performs &lt;strong&gt;three verification checks&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Decode&lt;/strong&gt; the header and payload to read the claims&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify&lt;/strong&gt; the signature using the same algorithm and key&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check&lt;/strong&gt; the token hasn't expired (&lt;code&gt;exp&lt;/code&gt; claim vs current time)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Only if all three checks pass does the server process the request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common JWT Claims
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Claim&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;iss&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Issuer&lt;/td&gt;
&lt;td&gt;Who issued the token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sub&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Subject&lt;/td&gt;
&lt;td&gt;Who the token is about (user ID)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aud&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Audience&lt;/td&gt;
&lt;td&gt;Who should accept the token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;exp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Expiration&lt;/td&gt;
&lt;td&gt;When the token becomes invalid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;iat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Issued At&lt;/td&gt;
&lt;td&gt;When the token was created&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nbf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Not Before&lt;/td&gt;
&lt;td&gt;Earliest time token is valid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jti&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JWT ID&lt;/td&gt;
&lt;td&gt;Unique token identifier&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Custom claims&lt;/strong&gt; can be anything you need: roles, permissions, tenant IDs, feature flags, etc. Just keep the payload small — the token is transmitted with every request.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Decode and Debug JWTs
&lt;/h2&gt;

&lt;p&gt;Decoding a JWT is simple because the header and payload are just Base64URL-encoded.&lt;/p&gt;

&lt;h3&gt;
  
  
  JavaScript Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;decodeJWT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;headerB64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;payloadB64&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;header&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;atob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;headerB64&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;atob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payloadB64&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eyJhbGciOi...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;decoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;decodeJWT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;decoded&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// { sub: "1234567890", name: "Alice", exp: 1709254800 }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decode_jwt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;header_b64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload_b64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Add padding if needed
&lt;/span&gt;    &lt;span class="n"&gt;payload_b64&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload_b64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlsafe_b64decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload_b64&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;decode_jwt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eyJhbGciOi...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Online Tools
&lt;/h3&gt;

&lt;p&gt;For quick debugging, I built a free &lt;strong&gt;Base64 Decoder&lt;/strong&gt; that can decode JWT payloads:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://stringtoolsapp.com/base64" rel="noopener noreferrer"&gt;StringToolsApp Base64 Decoder&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Split the JWT at the dots, paste each part into the decoder, and instantly see the JSON contents.&lt;/p&gt;

&lt;h2&gt;
  
  
  JWT Security Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ DO
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use strong asymmetric algorithms&lt;/strong&gt; (RS256, ES256) for production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set short expiration times&lt;/strong&gt; on access tokens (15 min to 1 hour)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement refresh tokens&lt;/strong&gt; for longer sessions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate all claims&lt;/strong&gt;: signature, exp, iss, aud&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use HTTPS only&lt;/strong&gt; — never send JWTs over HTTP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store access tokens in memory&lt;/strong&gt; (not localStorage)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Store refresh tokens in HTTP-only cookies&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotate refresh tokens&lt;/strong&gt; on each use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use a whitelist of accepted algorithms&lt;/strong&gt; during verification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log and monitor&lt;/strong&gt; failed verification attempts&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ❌ DON'T
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Don't store sensitive data&lt;/strong&gt; in JWT payloads (passwords, credit cards, SSNs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't use the &lt;code&gt;none&lt;/code&gt; algorithm&lt;/strong&gt; — it's a known attack vector&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't store JWTs in localStorage&lt;/strong&gt; — vulnerable to XSS attacks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't skip expiration checks&lt;/strong&gt; — expired tokens must be rejected&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't trust the &lt;code&gt;alg&lt;/code&gt; header blindly&lt;/strong&gt; — whitelist allowed algorithms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't use long-lived access tokens&lt;/strong&gt; — limits damage from token theft&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't forget audience validation&lt;/strong&gt; — prevents token misuse across services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't overload the payload&lt;/strong&gt; — keep it focused and small&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Common JWT Mistakes to Avoid
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mistake #1: Storing JWTs in localStorage
&lt;/h3&gt;

&lt;p&gt;localStorage is accessible to any JavaScript on your page. An XSS vulnerability gives attackers full access to stored tokens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better approach:&lt;/strong&gt; Store access tokens in memory (React state, closure variables) and refresh tokens in HTTP-only cookies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake #2: No Token Revocation Strategy
&lt;/h3&gt;

&lt;p&gt;JWTs remain valid until they expire. If a user changes their password or gets banned, outstanding JWTs can still be used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solutions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Short expiration times (15 min)&lt;/li&gt;
&lt;li&gt;Token blacklist/denylist&lt;/li&gt;
&lt;li&gt;Version counter on user records&lt;/li&gt;
&lt;li&gt;Refresh token rotation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mistake #3: Not Validating Audience
&lt;/h3&gt;

&lt;p&gt;In a microservice architecture, a token issued for the profile service shouldn't be accepted by the payment service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always set and validate the &lt;code&gt;aud&lt;/code&gt; claim.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake #4: Overloading the Payload
&lt;/h3&gt;

&lt;p&gt;Large tokens are transmitted with every request. Oversized tokens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increase bandwidth usage&lt;/li&gt;
&lt;li&gt;Slow down request processing&lt;/li&gt;
&lt;li&gt;May exceed HTTP header limits (typically 8KB)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Keep payloads focused on authentication and authorization only.&lt;/strong&gt; Fetch detailed user data separately.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake #5: Using the &lt;code&gt;none&lt;/code&gt; Algorithm
&lt;/h3&gt;

&lt;p&gt;Some JWT libraries accept tokens with &lt;code&gt;"alg": "none"&lt;/code&gt;, allowing attackers to create unsigned tokens that pass validation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always whitelist accepted algorithms&lt;/strong&gt; in your verification code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debugging JWT Issues
&lt;/h2&gt;

&lt;p&gt;When JWT authentication fails, check these in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Decode the token&lt;/strong&gt; — Verify the claims look correct&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check expiration&lt;/strong&gt; — Is &lt;code&gt;exp&lt;/code&gt; in the future?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check audience&lt;/strong&gt; — Does &lt;code&gt;aud&lt;/code&gt; match your service?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check issuer&lt;/strong&gt; — Is &lt;code&gt;iss&lt;/code&gt; what you expect?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify signature&lt;/strong&gt; — Is the signing key correct?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check algorithm&lt;/strong&gt; — Does &lt;code&gt;alg&lt;/code&gt; match your verification config?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clock skew&lt;/strong&gt; — Are server clocks synchronized?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key rotation&lt;/strong&gt; — Is the &lt;code&gt;kid&lt;/code&gt; pointing to a valid key?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;JWT tokens are a powerful authentication mechanism when used correctly. They enable stateless authentication, scale elegantly across microservices, and integrate seamlessly with modern web frameworks.&lt;/p&gt;

&lt;p&gt;But they're not a silver bullet. JWTs require careful implementation, especially around storage, revocation, and validation. Follow the security best practices, validate all claims rigorously, and always remember: &lt;strong&gt;JWTs are encoded, not encrypted&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Yourself 🚀
&lt;/h2&gt;

&lt;p&gt;Need to decode a JWT quickly? I built a free &lt;strong&gt;Base64 Decoder&lt;/strong&gt; that handles JWT payloads — no signup, 100% client-side:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://stringtoolsapp.com/base64" rel="noopener noreferrer"&gt;StringToolsApp Base64 Decoder&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Split any JWT at the dots, paste the parts, and see the contents instantly.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's your biggest JWT challenge? Token storage? Revocation? Refresh token rotation?&lt;/strong&gt; Drop a comment below! 💬&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>security</category>
      <category>webdev</category>
      <category>authentication</category>
    </item>
    <item>
      <title>JSON vs XML: Which Data Format Should You Choose in 2026?</title>
      <dc:creator>Progragon Technolabs</dc:creator>
      <pubDate>Fri, 10 Apr 2026 12:20:45 +0000</pubDate>
      <link>https://forem.com/progragon_technolabs/json-vs-xml-which-data-format-should-you-choose-in-2026-k23</link>
      <guid>https://forem.com/progragon_technolabs/json-vs-xml-which-data-format-should-you-choose-in-2026-k23</guid>
      <description>&lt;p&gt;Choosing between JSON and XML is one of the classic decisions every developer faces when designing APIs, building data pipelines, or integrating systems. Both formats have shaped the modern web, but in 2026, when should you reach for which? Let's break down the real differences and help you make the right choice for your next project.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is JSON?
&lt;/h2&gt;

&lt;p&gt;JSON, short for &lt;strong&gt;JavaScript Object Notation&lt;/strong&gt;, is a lightweight text-based data interchange format that uses human-readable key-value pairs and ordered lists to represent structured information. Although it originated from JavaScript, JSON is entirely language-independent and is natively supported by virtually every modern programming language.&lt;/p&gt;

&lt;p&gt;The structure of JSON revolves around two fundamental constructs: &lt;strong&gt;objects&lt;/strong&gt; (unordered collections of key-value pairs in curly braces) and &lt;strong&gt;arrays&lt;/strong&gt; (ordered lists of values in square brackets). Values can be strings, numbers, booleans, null, or nested objects and arrays.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isActive"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"admin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"editor"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Toronto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Canada"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JSON gained mainstream adoption in the mid-2000s when AJAX-based web applications replaced traditional page-reload architectures. Today, JSON is the default response format for REST APIs, the native document format for NoSQL databases like MongoDB, and the standard for configuration files in tools ranging from npm to VS Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is XML?
&lt;/h2&gt;

&lt;p&gt;XML, or &lt;strong&gt;Extensible Markup Language&lt;/strong&gt;, is a markup language designed to store, transport, and structure data. Developed by the W3C in the late 1990s, XML uses self-describing tags that make documents inherently documented and unambiguous.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;person&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Alice&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;age&amp;gt;&lt;/span&gt;30&lt;span class="nt"&gt;&amp;lt;/age&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;isActive&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/isActive&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;roles&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;role&amp;gt;&lt;/span&gt;admin&lt;span class="nt"&gt;&amp;lt;/role&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;role&amp;gt;&lt;/span&gt;editor&lt;span class="nt"&gt;&amp;lt;/role&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/roles&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;address&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;city&amp;gt;&lt;/span&gt;Toronto&lt;span class="nt"&gt;&amp;lt;/city&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;country&amp;gt;&lt;/span&gt;Canada&lt;span class="nt"&gt;&amp;lt;/country&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/address&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/person&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;XML documents follow a strict hierarchical tree structure and can be validated against schemas like &lt;strong&gt;XSD&lt;/strong&gt; or &lt;strong&gt;DTD&lt;/strong&gt;. Despite its age, XML remains deeply embedded in enterprise software, financial services (FIX, SWIFT), healthcare (HL7, FHIR), SOAP web services, RSS feeds, SVG graphics, and Microsoft Office formats.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Differences Between JSON and XML
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Syntax and Verbosity
&lt;/h3&gt;

&lt;p&gt;JSON is significantly more compact. A typical JSON document is &lt;strong&gt;30-50% smaller&lt;/strong&gt; than its XML equivalent because JSON doesn't require closing tags for every element.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Readability
&lt;/h3&gt;

&lt;p&gt;For simple data structures, JSON is easier to scan. For complex document-oriented content with mixed text and markup, XML can actually be more readable because each element has a descriptive tag.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Parsing Speed
&lt;/h3&gt;

&lt;p&gt;JSON parsers are &lt;strong&gt;2-5x faster&lt;/strong&gt; than XML parsers in most benchmarks. JSON has a simpler grammar and can be parsed directly into native data structures with a single function call.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Data Types
&lt;/h3&gt;

&lt;p&gt;JSON natively distinguishes between strings, numbers, booleans, arrays, objects, and null. XML treats everything as text by default — you need a schema to enforce types.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Comments
&lt;/h3&gt;

&lt;p&gt;XML supports comments out of the box. JSON does not (officially). This is why configuration formats like JSONC and JSON5 exist as extensions.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Namespaces
&lt;/h3&gt;

&lt;p&gt;XML supports namespaces to avoid naming conflicts when combining vocabularies. JSON has no native namespace concept.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use JSON
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;✅ Web APIs and REST services&lt;/strong&gt; — JSON is the default choice for modern web APIs. Every HTTP client and framework has excellent built-in support.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Configuration files&lt;/strong&gt; — &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;tsconfig.json&lt;/code&gt;, &lt;code&gt;.eslintrc.json&lt;/code&gt; — the JavaScript ecosystem runs on JSON configs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ NoSQL databases&lt;/strong&gt; — MongoDB, CouchDB, Elasticsearch, and Firebase all use JSON as their native format.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Real-time messaging&lt;/strong&gt; — WebSocket, server-sent events, and message queues favor JSON for its compactness and speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Mobile applications&lt;/strong&gt; — Smaller payload size directly impacts bandwidth usage and battery life on cellular networks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ JavaScript-heavy stacks&lt;/strong&gt; — JSON parses directly into native JavaScript objects with zero transformation overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use XML
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;✅ Enterprise integration&lt;/strong&gt; — SOAP web services, EDI transactions, and B2B data exchanges often mandate XML.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Regulated industries&lt;/strong&gt; — Finance, healthcare, and government require strict schema validation that XML provides.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Document-oriented content&lt;/strong&gt; — Publishing workflows, technical manuals, and legal documents benefit from XML's mixed-content model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Data transformation&lt;/strong&gt; — XSLT provides powerful declarative transformation capabilities that have no JSON equivalent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Complex querying&lt;/strong&gt; — XPath and XQuery offer sophisticated node selection and querying that go beyond simple JSON path expressions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Legacy systems&lt;/strong&gt; — When integrating with existing XML-based systems, adopting their format is more practical than building translation layers.&lt;/p&gt;

&lt;h2&gt;
  
  
  JSON vs XML Performance Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;JSON&lt;/th&gt;
&lt;th&gt;XML&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Serialization speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚡ 2-5x faster&lt;/td&gt;
&lt;td&gt;Slower&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Payload size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;📦 30-50% smaller&lt;/td&gt;
&lt;td&gt;Larger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Parsing speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚡ Faster&lt;/td&gt;
&lt;td&gt;Slower&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory usage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;💾 Lower&lt;/td&gt;
&lt;td&gt;Higher (DOM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Schema validation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JSON Schema (optional)&lt;/td&gt;
&lt;td&gt;XSD/DTD (built-in)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Native types&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ Text only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Comments&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Namespaces&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Raw performance isn't always the deciding factor. For applications processing a few dozen API calls per minute, the difference is imperceptible. But at scale — thousands of requests per second or resource-constrained mobile devices — JSON's performance advantages translate directly into lower infrastructure costs and better responsiveness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Example: Same Data, Both Formats
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;JSON (124 bytes):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"product"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Widget"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;19.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"inStock"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;XML (193 bytes):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;product&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;42&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Widget&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;price&amp;gt;&lt;/span&gt;19.99&lt;span class="nt"&gt;&amp;lt;/price&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;inStock&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/inStock&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/product&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a &lt;strong&gt;56% increase in size&lt;/strong&gt; for XML, and this difference grows dramatically for large datasets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making the Right Choice
&lt;/h2&gt;

&lt;p&gt;Choosing between JSON and XML isn't about declaring one format universally superior — it's about understanding your specific requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For modern web development, mobile apps, and microservices → Choose JSON.&lt;/strong&gt; Its simplicity, small size, fast parsing, and universal support make it the path of least resistance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For enterprise integration, regulatory compliance, or document-oriented content → Choose XML.&lt;/strong&gt; Its validation, transformation, and namespace capabilities are genuine advantages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For new projects with no format constraints → Start with JSON.&lt;/strong&gt; You can always add XML support later if integration requirements demand it.&lt;/p&gt;

&lt;p&gt;Many real-world systems use &lt;strong&gt;both formats&lt;/strong&gt; — consuming XML from legacy enterprise systems, transforming it internally, and exposing it as JSON through modern REST APIs. This hybrid approach is entirely valid and often represents the best pragmatic architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Yourself 🚀
&lt;/h2&gt;

&lt;p&gt;I built a free &lt;strong&gt;JSON Formatter &amp;amp; Validator&lt;/strong&gt; with a tree view, minify, and CSV export — no signup needed:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://stringtoolsapp.com/json-formatter" rel="noopener noreferrer"&gt;StringToolsApp JSON Formatter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It runs 100% client-side, so your JSON data never leaves your browser.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;JSON has become the default for modern web development with good reason — it's simple, fast, and universally supported. But XML still has important roles in enterprise integration, document processing, and regulated industries.&lt;/p&gt;

&lt;p&gt;Don't fight your ecosystem. Use each format where its strengths align with your needs. The best developers are the ones who know both and can pick the right tool for each job.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What format do you use most in your projects, and why?&lt;/strong&gt; Drop a comment below! 💬&lt;/p&gt;

</description>
      <category>json</category>
      <category>xml</category>
      <category>webdev</category>
      <category>api</category>
    </item>
    <item>
      <title>JavaScript Regex: A Complete Tutorial with Examples (2026)</title>
      <dc:creator>Progragon Technolabs</dc:creator>
      <pubDate>Fri, 10 Apr 2026 06:42:41 +0000</pubDate>
      <link>https://forem.com/progragon_technolabs/javascript-regex-a-complete-tutorial-with-examples-2026-4004</link>
      <guid>https://forem.com/progragon_technolabs/javascript-regex-a-complete-tutorial-with-examples-2026-4004</guid>
      <description>&lt;p&gt;Regular expressions (regex) are one of the most powerful tools in a JavaScript developer's toolkit. Whether you're validating user input, parsing text, or extracting data from strings, mastering regex will dramatically improve your productivity. This complete tutorial covers everything from basics to advanced features — with practical examples you can use immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction to Regex in JavaScript
&lt;/h2&gt;

&lt;p&gt;Regular expressions, commonly called regex or regexp, are sequences of characters that define search patterns used for matching, extracting, and manipulating text. In JavaScript, regular expressions are first-class objects built into the language, supported by dedicated syntax and a rich set of string and regex methods.&lt;/p&gt;

&lt;p&gt;JavaScript supports regular expressions through the &lt;code&gt;RegExp&lt;/code&gt; object and through regex literals enclosed in forward slashes. A regex literal like &lt;code&gt;/hello/i&lt;/code&gt; creates a pattern that matches the word hello case-insensitively. The &lt;code&gt;RegExp&lt;/code&gt; constructor, written as &lt;code&gt;new RegExp('hello', 'i')&lt;/code&gt;, achieves the same result but allows dynamic pattern construction from variables and user input.&lt;/p&gt;

&lt;p&gt;Regex is an essential skill for JavaScript developers because text processing is central to web development. Form validation, URL routing, template parsing, syntax highlighting, and data extraction all rely on pattern matching.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating Regex Patterns
&lt;/h2&gt;

&lt;p&gt;The simplest regex pattern is a literal string match. The pattern &lt;code&gt;/cat/&lt;/code&gt; matches the exact sequence of characters c, a, t anywhere in a string. By default, regex is case-sensitive. Adding the &lt;code&gt;i&lt;/code&gt; flag makes the match case-insensitive.&lt;/p&gt;

&lt;p&gt;Special characters called metacharacters give regex its power beyond simple literal matching:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.&lt;/code&gt; — matches any single character except a newline&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;^&lt;/code&gt; — anchors a pattern to the start of the string&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$&lt;/code&gt; — anchors a pattern to the end&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;()&lt;/code&gt; — creates capturing groups&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;|&lt;/code&gt; — alternation operator (logical OR)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[]&lt;/code&gt; — defines character classes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you need to match a metacharacter literally, escape it with a backslash. To match an actual dot, use &lt;code&gt;\.&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common flags:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;g&lt;/code&gt; — global (find all matches)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;i&lt;/code&gt; — case-insensitive&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;m&lt;/code&gt; — multiline&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;s&lt;/code&gt; — dotAll (dot matches newlines)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;u&lt;/code&gt; — Unicode mode&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;d&lt;/code&gt; — indices for capture groups&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Character Classes and Quantifiers
&lt;/h2&gt;

&lt;p&gt;Character classes define sets of characters that can match at a specific position. &lt;code&gt;[aeiou]&lt;/code&gt; matches any single vowel. &lt;code&gt;[^aeiou]&lt;/code&gt; negates the class. Ranges: &lt;code&gt;[a-z]&lt;/code&gt;, &lt;code&gt;[0-9]&lt;/code&gt;, &lt;code&gt;[a-zA-Z0-9]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shorthand character classes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;\d&lt;/code&gt; — any digit (0-9)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\D&lt;/code&gt; — non-digit&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\w&lt;/code&gt; — word character (letters, digits, underscore)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\W&lt;/code&gt; — non-word character&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\s&lt;/code&gt; — whitespace&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\S&lt;/code&gt; — non-whitespace&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quantifiers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;?&lt;/code&gt; — zero or one&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;*&lt;/code&gt; — zero or more&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;+&lt;/code&gt; — one or more&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{3}&lt;/code&gt; — exactly three&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{2,5}&lt;/code&gt; — between two and five&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{3,}&lt;/code&gt; — three or more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By default, quantifiers are &lt;strong&gt;greedy&lt;/strong&gt; (match as much as possible). Adding &lt;code&gt;?&lt;/code&gt; makes them &lt;strong&gt;lazy&lt;/strong&gt; (match as little as possible).&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Regex Methods in JavaScript
&lt;/h2&gt;

&lt;p&gt;JavaScript provides regex functionality through both &lt;code&gt;RegExp&lt;/code&gt; methods and &lt;code&gt;String&lt;/code&gt; methods.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;test()&lt;/strong&gt; — Returns true/false:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/hello/i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello World&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;match()&lt;/strong&gt; — Returns match details:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The year is 2026&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="sr"&gt;+/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// "2026"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;matchAll()&lt;/strong&gt; — Returns all matches as iterator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat and bat and rat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;matches&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;matchAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\w&lt;/span&gt;&lt;span class="sr"&gt;+at/g&lt;/span&gt;&lt;span class="p"&gt;)];&lt;/span&gt;
&lt;span class="c1"&gt;// [["cat"], ["bat"], ["rat"]]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;replace() / replaceAll()&lt;/strong&gt; — Substitute matches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello world&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/world/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JavaScript&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// "hello JavaScript"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;split()&lt;/strong&gt; — Divide string using regex as delimiter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;one, two  three;four&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;,;&lt;/span&gt;&lt;span class="se"&gt;\s]&lt;/span&gt;&lt;span class="sr"&gt;+/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// ["one", "two", "three", "four"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Practical Regex Examples
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Email validation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emailRegex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;a-zA-Z0-9._%+-&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+@&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;a-zA-Z0-9.-&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;\.[&lt;/span&gt;&lt;span class="sr"&gt;a-zA-Z&lt;/span&gt;&lt;span class="se"&gt;]{2,}&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;emailRegex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user@example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Phone number (flexible format):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;phoneRegex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;\+?[\d\s&lt;/span&gt;&lt;span class="sr"&gt;()-&lt;/span&gt;&lt;span class="se"&gt;]{10,}&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;phoneRegex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;+1 (555) 123-4567&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;URL validation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;urlRegex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/^https&lt;/span&gt;&lt;span class="se"&gt;?&lt;/span&gt;&lt;span class="sr"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\/\/[\w&lt;/span&gt;&lt;span class="sr"&gt;.-&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;\.[&lt;/span&gt;&lt;span class="sr"&gt;a-z&lt;/span&gt;&lt;span class="se"&gt;]{2,}(\/\S&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;)?&lt;/span&gt;&lt;span class="sr"&gt;$/i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;urlRegex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://dev.to&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Password strength (8+ chars, uppercase, lowercase, digit, special):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;passwordRegex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;(?=&lt;/span&gt;&lt;span class="sr"&gt;.*&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;a-z&lt;/span&gt;&lt;span class="se"&gt;])(?=&lt;/span&gt;&lt;span class="sr"&gt;.*&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;A-Z&lt;/span&gt;&lt;span class="se"&gt;])(?=&lt;/span&gt;&lt;span class="sr"&gt;.*&lt;/span&gt;&lt;span class="se"&gt;\d)(?=&lt;/span&gt;&lt;span class="sr"&gt;.*&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;!@#$%^&amp;amp;*&lt;/span&gt;&lt;span class="se"&gt;])&lt;/span&gt;&lt;span class="sr"&gt;.&lt;/span&gt;&lt;span class="se"&gt;{8,}&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;passwordRegex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Strong@123&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Advanced Regex Features
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Lookahead and Lookbehind:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Positive lookahead: number followed by USD&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;(?&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;sUSD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100 USD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// "100"&lt;/span&gt;

&lt;span class="c1"&gt;// Negative lookbehind: word not preceded by "not"&lt;/span&gt;
&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;!not&lt;/span&gt;&lt;span class="se"&gt;\s)\b&lt;/span&gt;&lt;span class="sr"&gt;good&lt;/span&gt;&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;this is good&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Named Capture Groups:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dateRegex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;year&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\d{4})&lt;/span&gt;&lt;span class="sr"&gt;-&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;month&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\d{2})&lt;/span&gt;&lt;span class="sr"&gt;-&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;day&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\d{2})&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2026-04-10&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dateRegex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;year&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "2026"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Non-Capturing Groups:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Group without capturing&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(?:&lt;/span&gt;&lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;)?([&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="c1"&gt;// "example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Unicode Property Escapes:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Match any letter from any language&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="sr"&gt;/u.test&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;"café"&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;; /&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="sr"&gt;/u.test&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;"日本語"&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;; /&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing Your Regex Online
&lt;/h2&gt;

&lt;p&gt;Online regex testing tools are indispensable for developing and debugging regular expressions. These tools let you enter a pattern and test string, then instantly see all matches highlighted in the text. The immediate visual feedback makes it dramatically easier to iterate on a pattern compared to writing code, running it, and inspecting the output.&lt;/p&gt;

&lt;p&gt;When developing complex regex patterns, build them incrementally. Start with the simplest possible pattern that matches the core of what you need, then add components one at a time. After each addition, verify that existing matches are preserved and new edge cases are handled.&lt;/p&gt;

&lt;p&gt;Performance matters too. Some patterns, particularly those with nested quantifiers or overlapping alternatives, can exhibit &lt;strong&gt;catastrophic backtracking&lt;/strong&gt; where the regex engine explores an exponential number of paths. If a pattern takes thousands of steps to match a short string, it needs restructuring.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Yourself 🚀
&lt;/h2&gt;

&lt;p&gt;I built a free &lt;strong&gt;JavaScript Regex Tester&lt;/strong&gt; with live highlighting, capture group inspection, and flag toggles — no signup needed:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://stringtoolsapp.com/regex-tester" rel="noopener noreferrer"&gt;StringToolsApp Regex Tester&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's 100% client-side, so your regex and test strings never leave your browser.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Regular expressions are a skill that pays dividends for your entire programming career. Start with the basics — literal matches, character classes, quantifiers — and build up to advanced features like lookaheads and named groups as you need them. The key is consistent practice and testing your patterns against real-world input.&lt;/p&gt;

&lt;p&gt;What's your favorite regex pattern? Drop it in the comments below! 💬&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>regex</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
