[英]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:
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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.