我有一个正常的正则表达式,除了在一个特定的情况下;
$message = preg_replace("#(^(http(s)?://)(?!img.youtube.com/vi/)([-a-zA-Z?-??-?()0-9@:%_+.~\#?&;//=,]+(\.jpg|\.jpeg|\.gif|\.bmp|\.png)))#i",
"<p><a href='/viewpost.php?messageid=$message_id'><img src='$1' width=100%></a>", $message);
这种模式可以做几件事,1)它完全匹配http或https,2)它忽略包含img.youtube.com/vi/的任何字符串,3)它在链接中查找流行的图像文件类型。只有当它们在刺痛之前没有角色时才会起作用(像http://exampleaddress/exampleimage.jpeg
这样的刺痛)。如果字符串位于段落的中间,则会失败。
我需要保持^(http(s)?://)作为完全匹配(删除^修复我的问题,但导致与后续正则表达式规则冲突。所以,看起来问题是这个确切匹配情况不希望任何回车,空格或任何东西在^(http(s)?://)之前。如何使正则表达式工作,以便在字符串之后没有任何内容相关,但是当你看到确切的http或https应用规则?
答案 0 :(得分:1)
如您所知,^
锚点要求字符串恰好出现在输入字符串的开头。您可以使用\b
字边界在输入字符串内实现类似的限制任何地方。它匹配单词开头的零长度字符串 - 例如,之后但不包括空格。
我还要注意,您不需要在s
组中包围()
,因为?
只会匹配前一个字符。
\bhttps?://...