使用正则表达式获得带有一些规则的url


Using regex to get urls with some rules

一个字符串包含多个url,如何获取不以[url]开始,不以[/url]结束的url

的例子:

一个字符串包含多个url: https://stackoverflow.com/1 [url]https://stackoverflow.com/2[/url] https://stackoverflow.com/3 [url]https://stackoverflow.com/4[/url],如何获得匹配的url ?

在本例中,只需要返回https://stackoverflow.com/1https://stackoverflow.com/3

我将只在正则表达式下划线,因为它对于获取url非常重要。所以它将是:

 (?!'[url'])'s+'bhttp:'/'/stackoverflow.com'/'d's+(?<!'['/url'])
您可以使用php函数preg_match_all 在这个Url中看到结果。

但在那之前,让我们了解它的每一部分(你可以在同一个网站找到)

(?!'[url'])'s+'bhttp:'/'/stackoverflow.com'/'d's+(?<!'['/url'])
  • (?!'[url']) 负向前看-断言不可能匹配

    下面的正则表达式
    • '[ 匹配字符[字面意思
    • url从字面上匹配字符url(不区分大小写)
    • '] 匹配字符] 字面

  • 's+ 匹配任何空白字符['r'n't'f]量词:+在一次到无限次之间,尽可能多的次数,根据需要回馈[贪心]

  • 'b 在字边界断言位置(^'w | 'w$ | 'W'w | 'w'W)

  • http:匹配字符http:字面上(区分大小写)

  • '/ 匹配字符/字面

  • '/ 匹配字符/字面

  • stackoverflow匹配字符stackoverflow字面意思(区分大小写)

  • . 匹配任何字符(换行符除外)

  • com匹配字符com字面意思(区分大小写)

  • /匹配字符/字面

  • 'd 匹配数字[0 - 9]

  • 's+ 匹配任何空白字符['r'n't'f]量词:+在一次到无限次之间,尽可能多的次数,根据需要给予回馈[greedy]

  • (?<!'['/url']) Negative Lookbehind -断言不可能匹配

    下面的正则表达式
    • '[ 匹配字符[字面意思
    • '/ 匹配字符/字面意思
    • url匹配字符url(不区分大小写)
    • '] 匹配字符]字面意思

最后您需要使用php函数,如下所示:

preg_match_all("(?!'[url'])'s+'bhttp:'/'/stackoverflow.com'/'d's+(?<!'['/url'])", $input_lines, $output_array);

$input_lines是保存字符串

的变量。

$output_array保存url的数组

(?<!'[url'])(?![^'s]+'['/url'])http[^'s]*

这将获取未包含在您提到的标记([url]['url])中的所有url。请注意,这适用于每个URL,而不仅仅是你列出的一个(即http://stackoverflow.com),我认为这是你想要的。您可以在Regex101上看到每个规则的解释和现场演示-链接:https://regex101.com/r/wN9aX0/3

这是一个有点复杂的模式,可能并不适用于所有情况,但适用于大多数情况。如果在你想让它工作的情况下它不起作用,我可以进一步调整它:

(?<!('[url']))['s.:]((http|https)(:'/'/))?([[:alnum:]'-_]*)((['.])([[:alnum:]'-_]*)){1,}(['/]([[:alnum:]'-_]*))*[.:;'s]((?!'['/url']))

这对你有帮助:

var patt =/(?:'bhttp:'/'/stackoverflow.com'/'d{1,})(?!'['/url'])/;

的例子:

<html>
<head></head>
    <body>
         <script>
             var patt =/(?:'bhttp:'/'/stackoverflow.com'/'d{1,})(?!'['/url'])/;
             var str = "http://stackoverflow.com/2";
             if(patt.test(str))
                 alert("Valid");
             else
                 alert("Invalid");
        </script>
    </body>
</html>