Php 从正则表达式语句匹配特定模式

Php 从正则表达式语句匹配特定模式,php,regex,Php,Regex,在过去的几天里,我一直在试图找出解决这个问题的方法,并发表了自己的文章,但到目前为止还没有定论。我想这可能比我一直想的要容易,但我需要一些帮助 这里有一个非常基本的regex语句,它链接了几乎所有的链接。这不是我拥有的唯一正则表达式模式,因此我加入了一个跳过链接的片段,如果它包含特定的模式“img.youtube.com/vi/”,它工作得很好 $message = preg_replace("#(((f|ht)tp(s)?://)?!(img.youtube.com/vi/)[-a-zA-Z?

在过去的几天里,我一直在试图找出解决这个问题的方法,并发表了自己的文章,但到目前为止还没有定论。我想这可能比我一直想的要容易,但我需要一些帮助

这里有一个非常基本的regex语句,它链接了几乎所有的链接。这不是我拥有的唯一正则表达式模式,因此我加入了一个跳过链接的片段,如果它包含特定的模式“img.youtube.com/vi/”,它工作得很好

$message = preg_replace("#(((f|ht)tp(s)?://)?!(img.youtube.com/vi/)[-a-zA-Z?-??-?()0-9@:%_+.~\#?&;//=,])+#i", "<a href=$1 target='_blank'><b>$1</b></a>", $message);
$message=preg\u replace(“((f|ht)tp(s):/)?!(img.youtube.com/vi/)[-a-zA-Z?-?(-0-9@:%\+.~\\\\?&;/=,])+\i”,“,$message);
我不想用.jpeg、jpg、gif或任何流行的图像格式链接任何url,我有另一个表达式可以嵌入这些链接(它也可以正常工作)。所以,我需要找到一种方法让这个表达式拒绝这些链接

我已经得到了关于消极环顾法的建议,与特定字符串相匹配,但到目前为止,它们似乎都不起作用。我需要找到一种方法让这个正则表达式忽略任何以.jpeg等结尾的URL

因此,上面的regex语句已经有一个字符串示例,它取消了某些URL的资格-?!(img.youtube.com/vi/)。这似乎是我需要做的全部,但我应该把它放在哪里,它看起来怎么样?语句中的+符号使正则表达式可以使用匹配字符[-a-zA-Z?-?-?()0-9@:%+。~#?&;//=,]检查字符串,直到字符串的结尾。因此,这个匹配字符串可能应该放在+符号之前。它在“?!(img.youtube.com/vi/)中出现了吗?在我看来,它应该是这样的

$message = preg_replace("#(((f|ht)tp(s)?://)?!(img.youtube.com/vi/|/^\.jpeg$/|/^\.jpg$/|/^\gif$/)[-a-zA-Z?-??-?()0-9@:%_+.~\#?&;//=,])+#i", 
"<a href=$1 target='_blank'><b>$1</b></a>", $message); 
$message=preg\u replace(“#((f|ht)tp(s)://)?!(img.youtube.com/vi/|/^\.jpeg$/|/^\.jpg$/|/^\gif$/)[-a-zA-Z-?()0-9:%.+.-\\\\\\\\\\\\?&/=,]+,
“,$message);

感谢您的帮助

我回答并清理您的regexp

(?i)((?:f|ht)tps?://((?!img|jpe?g|gif|png|bmp))(?:([-a-z0-9()@:%_+.~#?&;/=,])(?2))+(?!(?3)))
现在,您不想要的
img
等处于负前瞻状态,您可以添加您不喜欢的内容

$good="http://www.google.com/";
$bad="http://img.google.com/";
$r="#(?i)((?:f|ht)tps?://((?!img|jpe?g|gif|png|bmp))(?:([-a-z0-9()@:%_+.~\#?&;/=,])(?2))+(?!(?3)))#";
$rep="<a href=$1 target='_blank'><b>$1</b></a>"; 
echo preg_replace($r,$rep,$good); 
echo preg_replace($r,$rep,$bad);
$good=”http://www.google.com/";
$bad=”http://img.google.com/";
$r=“#(i)((?:f|ht)tps:/(?!img | jpe?g | gif | png | bmp))(?:([-a-z0-9()@:%\\\\\?&;/=,])(?)+(?!((3))”;
$rep=“”;
echo preg_替换($r,$rep,$good);
echo preg_替换($r、$rep、$bad);

您可以在此处尝试

只需删除正则表达式的这一部分:

img|

<?php
$good="http://www.google.com/";
$bad="http://img.google.com/";
$r="#(?i)((?:f|ht)tps?://((?!jpe?g|gif|png|bmp))(?:([-a-z0-9()@:%_+.~\#?&;/=,])(?2))+(?!(?3)))#";
$rep="<a href=$1 target='_blank'><b>$1</b></a>"; 
echo preg_replace($r,$rep,$good); echo "\n";
echo preg_replace($r,$rep,$bad);
?>
img|

@kikomaru现在我的回答中有在线演示,谢谢你,汉斯-这完全有效。我感谢你的帮助,并将学习你的例子。