Regex:匹配一个以http/https或site.com开头但不以前缀开头的链接


Regex: match a link that begins with http/https or just site.com/... but NOT with prefix?

我需要匹配链接,但只能匹配那些不以字符串[image:x]开头的链接,其中x是链接本身。

我在preg_replace中需要这个,这样只有适合的链接才会被更改,这里有一个例子:

"有一次一只狗吃了我的书http://mysite.com/dog.jpg,我不得不去去商店https://www.mysite.com/images/store.png买一台新iPadapple.com/iPad/iPadMini.jpg在那里很有趣[image:http://apple.com/iPad/images/iPads.com]"

将作为

"有一次一只狗吃了我的书[image:http://mysite.com/dog.jpg],我不得不去去[image:https://www.mysite.com/images/store.png]商店买一台新iPad[image:apple.com/iPad/iPadMini.jpg]那里很有趣[image:http://apple.com/iPad/images/iPads.com]"

注意最后一个链接,因为现在我把它加倍了(链接仍然由preg_replace获取)。就像这里(不是想要的效果,我需要它原封不动):

...[image:apple.com/iPad/iPadMini.jpg]在那里很有趣
[image:[image:http://apple.com/iPad/images/iPads.com]]"

这是我目前的位置:

preg_replace('~(https?://)?['w-]+('.['w-]+)+'.?(:'d+)?('S*)'.(jpg|png|jpeg|bmp|gif)~','[[image:$0]]',$text);

您可以使用负查找。

我们不希望它以'[image:'开头。我们也不希望从单词中间开始。使用'b可以防止这种情况。如果字符串以http://开头,则应将其包含在匹配中,因此不要在http://https://之后匹配。

preg_replace('~(?<!'[image:)(?<!http://)(?<!https://)(?<!'w'.)(https?://)?'b['w-]+('.['w-]+)+'.?(:'d+)?('S*)'.(jpg|png|jpeg|bmp|gif)~','[image:$0]',$text);

检查这个PHP小提琴

注意:这也不会替换缺少最后一个]的字符串,比如[image:example.com