我使用以下Regex来匹配PHP中的所有类型的URL(效果非常好):
$reg_exUrl = "%\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))%s";
但是现在,我想要排除Youtube,youtu.be和Vimeo网址:
我在研究之后做了这样的事情,但它没有用:
$reg_exUrl = "%\b(([\w-]+://?|www[.])(?!youtube|youtu|vimeo)[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))%s";
我想这样做,因为我有另一个正则表达式匹配Youtube网址,它返回一个iframe,这个正则表达式导致两个正则表达式混淆。
感谢任何帮助,谢谢。
答案 0 :(得分:2)
socodLib,要从字符串中排除某些内容,请将自己置于字符串的开头,方法是使用^
(或使用其他锚点)进行锚定并使用否定前瞻来断言该字符串不包含这样的话:
^(?!.*?(?:youtube|some other bad word|some\.string\.with\.dots))
在我们通过将正则表达式与你的连接看起来太复杂之前,让我们看看如果你想匹配一些单词字符\w+
而不是youtube或google,我们会怎么做,你会写:
^(?!.*?(?:youtube|google))\w+
正如您所看到的,在断言(我们说不想要之后)之后,我们通过使用\ w + 来说明我们想要的内容p>
在你的情况下,让我们为你的初始正则表达式添加一个负向前瞻(我还没有调整过):
$reg_exUrl = "%(?i)\b(?!.*?(?:youtu\.?be|vimeo))(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))%s";
我冒昧地使用(?i)
使正则表达式不区分大小写。您最后还可以在i
修饰符中添加s
。 youtu\.?be
表达式允许使用可选的点。
我确信您可以将此配方应用于您的表达和将来的其他正则表达式。
<强>参考强>