从正则表达式语句中省略特定的模式


Ommitting a specific pattern from a regex statement

我花了过去几天试图找出如何解决这个特殊的问题,并张贴在SO,但没有骰子到目前为止。我想这可能比我想象的要容易,但我需要一些帮助;

这是一个非常基本的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);

我不希望这个链接任何url与。jpeg, jpg, gif,或任何流行的图像格式,我有另一个表达式,将嵌入这些类型的链接(它工作得很好,太)。所以,我需要找到一种方法让这个表达式拒绝这些类型的链接。

我已经得到了关于负查找的建议,匹配特定的字符串,但到目前为止,它们似乎都不起作用。我需要找到一种方法让这个正则表达式忽略任何以。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); 

任何帮助都是感激的。

我回答并清理您的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);

你可以在这里试试http://ideone.com/419yfm

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

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);
?>
演示