一个字符串包含多个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/1
和https://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>