使用正则表达式获取具有一些规则的URL

时间:2016-06-24 13:08:03

标签: php regex

一个字符串包含许多网址,如何获取网址不是[url]开头,而不是[/url]

示例:

  

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

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

4 个答案:

答案 0 :(得分:1)

我只会强调正则表达式,因为获取网址非常重要。所以它将是:

 (?!\[url\])\s+\bhttp:\/\/stackoverflow.com\/\d\s+(?<!\[\/url\])

您可以使用php函数preg_match_all

在此Url中查看结果

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

(?!\[url\])\s+\bhttp:\/\/stackoverflow.com\/\d\s+(?<!\[\/url\])
  • (?!\[url\]) 否定前瞻 - 断言无法匹配下面的正则表达式

    • \[ 匹配字符 [ 字面
    • url 字面匹配字符网址(不区分大小写)
    • \] 与字符 ] 字面匹配
  • \s+ 匹配任何空白字符[\r\n\t\f] 量词:+在一次和无限次之间,尽可能多次,根据需要回馈[贪心]

  • \b 在字边界处置位(^\w | \w$ | \W\w | \w\W)< / p>

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

  • \/ 匹配字符 / 字面

  • \/ 匹配字符 / 字面

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

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

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

  • / 匹配字符 / 字面

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

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

  • (?<!\[\/url\]) 否定的Lookbehind - 断言无法匹配下面的正则表达式

    • \[ 匹配字符 [ 字面
    • \/ 与字符 / 匹配
    • 网址字面匹配字符 网址 (不区分大小写)
    • \] 与字符 ] 字面匹配

最后你需要使用php函数如下:

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

$input_lines是保存字符串

的变量

$output_array包含网址的数组

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这有助于您:

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>

答案 3 :(得分:0)

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

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