擅长:python、mysql、java
<p>您的问题是,<code>http://</code>被接受为url的有效部分。这是因为这里的代币:</p>
<pre><code>[$-_@.&+]
</code></pre>
<p>或者更具体地说:</p>
^{pr2}$
<p>这将匹配范围从<code>$</code>到<code>_</code>的所有字符,其中包含的字符可能比您预期的要多得多。在</p>
<p>您可以将其更改为<code>[$\-_@.&+]</code>,但这会导致问题,因为现在,<code>/</code>字符将不匹配。所以用<code>[$\-_@.&+/]</code>添加它。但是,这将再次导致问题,因为<code>http://example.com/path/topage.htmlhttp</code>将被视为有效匹配。在</p>
<p>最后添加的是添加一个lookahead以确保您没有匹配<code>http://</code>或{<cd9>},这恰好是regex的第一部分!在</p>
<pre><code>http[s]?://(?:(?!http[s]?://)[a-zA-Z]|[0-9]|[$\-_@.&+/]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+
</code></pre>
<p>测试<a href="https://regex101.com/r/sF0oM0/1" rel="nofollow">here</a></p>