一个字符串包含许多网址,如何获取网址不是[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/1
和https://stackoverflow.com/3
。
答案 0 :(得分:1)
我只会强调正则表达式,因为获取网址非常重要。所以它将是:
(?!\[url\])\s+\bhttp:\/\/stackoverflow.com\/\d\s+(?<!\[\/url\])
您可以使用php函数preg_match_all
但在此之前让我们了解它的每一部分(你可以在同一个网站找到它)
(?!\[url\])\s+\bhttp:\/\/stackoverflow.com\/\d\s+(?<!\[\/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