我花了最近几天试图弄清楚如何解决这个问题并在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);
感谢任何帮助。
答案 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);
?>