我有一个正则表达式,除了在一种特殊情况下,它运行良好。
$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)?://)保留为完全匹配项(删除^解决了我的问题,但与后续的regex规则产生了冲突。因此,看起来像问题在于这种完全匹配的情况确实我不希望任何回车,空格或任何在^(http(s)?://://之前)的方法,如何使正则表达式起作用,以使字符串后的内容无关紧要,但是当您看到的正是http或https时适用规则?
如您所知,^
锚点要求字符串精确显示在输入字符串的开头。您可以在带有单词边界的输入字符串中的任何位置实现类似的限制\b
。它与单词开头的零长度字符串匹配-例如,但不包括空格。
我还要注意,您不需要将包围s
在一个()
组中,因为?
只会匹配前面的单个字符。
\bhttps?://...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句