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

时间:2014-05-11 19:51:15

标签: php regex

我花了最近几天试图弄清楚如何解决这个问题并在SO上发帖,但到目前为止还没有骰子。我认为这可能比我做得更容易,但我需要一些帮助;

这是一个非常基本的正则表达式语句,几乎链接任何链接。它不是我唯一的正则表达式模式,所以如果它包含特定的模式,我已经包含了一个跳过链接的文章" 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);

我不希望这个链接任何网址与.jpeg,jpg,gif或任何流行的图片格式,我有另一个表达式将嵌入这些类型的链接(它也工作正常)。所以,我需要找到一种方法来让这个表达式拒绝那些类型的链接。

我已经得到了关于负面外观的建议,与特定字符串匹配,但到目前为止它们似乎都没有。我需要找到一种方法来使这个正则表达式忽略任何以.jpeg结尾的URL等等;

因此,上面的正则表达式语句已经有一个取消某些URL的字符串的示例 - ?!(img.youtube.com/vi/)。这似乎就是我需要做的所有事情,但我在哪里放它以及它看起来如何?语句中的+符号使得正则表达式将使用[-a-zA-Z? - ?? - ?()0-9 @的匹配字符仔细检查字符串到结尾的字符串: %_ +〜#?&安培;; // =,]。因此,这个匹配的字符串应该放在+符号之前的某个位置。是否进入&#34;?!(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); 

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我回答并清理你的正则表达式

(?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

答案 1 :(得分:0)

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

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

DEMO