关于php:添加任何模式以匹配正则表达式

Adding any pattern to match in regex

我有一个很好的正则表达式,除了在一个特定的情况下;

1
2
3
$message = preg_replace("#(^(http(s)?://)(?!img.youtube.com/vi/)([-a-zA-Z?-??-?()0-9@:%_+.~\#?&;//=,]+(\.jpg|\.jpeg|\.gif|\.bmp|\.png)))#i",
"<p>
<img src='$1' width=100%>"
, $message);

这个模式有几个功能,1)它完全匹配HTTP或HTTPS,2)它忽略任何包含img.youtube.com/vi/的字符串,3)它在链接中查找流行的图像文件类型。它的工作方式,只有当他们不是一个字符之前的刺(刺像http://exampleaddress/exampleimage.jpeg)。如果字符串在段落中间,则失败。

我需要保留^(http(s)?://)作为完全匹配(删除^可以解决我的问题,但会与随后的regex规则发生冲突。所以,看起来问题在于,这种完全匹配的情况不希望在^(http(s))之前有任何回车、空格或其他内容。://)。如何使regex工作,使字符串前后的任何内容都不相关,但当您看到应用规则的HTTP或HTTPS时?


如您所知,^锚定要求字符串恰好出现在输入字符串的开头。您可以在输入字符串内任何具有\b字边界的地方实现类似的限制。它在单词开头匹配一个零长度的字符串,例如在单词后面,但不包括空格。

我还要注意的是,您不需要将s包围在()组中,因为?只匹配前面的单个字符。

1
\bhttps?://...