1

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

我需要在 preg_replace 中使用它,以便仅更改适合的链接,这是一个示例:

“有一次狗吃了我的书http://mysite.com/dog.jpg,我不得不去商店https://www.mysite.com/images/store.png买一个新的 iPad apple.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);
4

1 回答 1

1

您可以使用否定的lookbehind

我们不希望它以 '[image:' 开头。我们也不想从一个单词的中间开始。这是防止使用\b. 如果以它开头的字符串http://应该包含在匹配中,所以不要在http://or之后匹配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.

于 2013-02-05T15:38:21.660 回答