如何从URL中排除单词或字符串 - 正则表达式

时间:2014-04-21 22:34:52

标签: php regex url

我使用以下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,这个正则表达式导致两个正则表达式混淆。

感谢任何帮助,谢谢。

1 个答案:

答案 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修饰符中添加syoutu\.?be表达式允许使用可选的点。

我确信您可以将此配方应用于您的表达和将来的其他正则表达式。

<强>参考

  1. Regex lookarounds
  2. StackOverflow regex FAQ