2011-05-06 107 views
2

我有此链接:正则表达式:排除某些字符串,但包括其他

http://anthropology.school.com/stuff/anthropology.999.ug.courses 

什么是正则表达式来排除包含/stuff/的每一个环节,但仍然包括含有999.ug.courses(即使/stuff/包括)中的那些

因此,举例来说,上面的链接会因为它同时包含999.ug.courses/stuff/

我只是不想上是好的仅在链接中包含/stuff/

此外,我正在写一个简单的配置文本文件在我使用的开源中。

样品:

^http://([a-zA-Z0-9]*\.)*school.com/

^(file|ftp|mailto):

\.gif|GIF|jpg|com|JPG|js|png|php|PNG|pp|ico|atom|ICO|css|sit|eps|wmf|zip|ppt|mpg|xls|gz|rpm|tgz|mov|MOV|py|exe|pdf|jpeg|JPEG|bmp|BMP)$

[?*[email protected]=]

(/about|/giving|/admissions|/Admissions|/studyabroad|/summer|/spring.in.ny|/winter|/academics|/life|/research|/global|/footer|/content|/AZ|/registrar|/its|/shc|/999|/explore.school|/prehealth|/eve|/people|/events|/IAA|sca|/aboutus|/subfields|/specialprograms|/newsevents|/resources|/employment)

谢谢。

+1

你能发布更多示例网址吗?你总是只想要“999.ug.courses”部分的网址吗? – 2011-05-06 17:05:05

回答

2

如果这些是你需要匹配的唯一的东西,这个表达式应该做的(在Perl格式):

/http:\/\/anthropology.school.com(\/\w+\/(?<!\/stuff\/)\w*)|(\/stuff\/anthropology\.999\.ug\.courses)/ 

它首先无论是命名为任何目录,但相匹配的URL的开头,然后东西/stuff/anthropropology.999.ug.courses

+0

其实我必须拥有它,以便开始时以负号表示排除信号。比方说,我只给了你这个: -/stuff/anthropology.999.ug.courses基本上说,排除/stuff/anthropology.999.ug.courses我希望它与ONLY/stuff /的任何链接都被忽略。但是如果它在链接中有999.ug.courses,那么我有我的答案。事情是,我必须在表达式前使用减号( - )。谢谢 – Mike 2011-05-06 18:37:48

+1

请确保您在域中避开点,以便它们不匹配随机字符。 – 2011-05-06 18:46:26

+0

好点Ates!我记得他们的最后部分虽然... :) – Kaivosukeltaja 2011-05-06 19:38:05

0

它是否必须是一个单一的正则表达式?你能做!/\/stuff\// || /999.ug.courses/吗?

+0

我不这么认为。这里有一个有效的正则表达式示例:+^http://([a-zA-Z0-9] * \。)* school.com/ – Mike 2011-05-06 18:31:16

+0

不确定你的意思。 “有效”是什么意思? – Arkadiy 2011-05-06 18:43:37

+0

我认为迈克只是误解了你的简写。 – cmbuckley 2011-05-06 18:56:53

0

您正在寻找条件子模式评估。下面的正则表达式应该为你工作:

~.*?(999\.ug\.courses)(?(1).*?|(?<!/stuff/))~ 

使用PHP代码:

preg_match('~.*?(999\.ug\.courses)(?(1).*?|(?<!/stuff/))~', $str, $m); 
var_dump($m); 

当我运行上面的代码:

$str ="http://anthropology.school.com/stuff/anthropology.999.ug.courses"; 

我:

array(2) { 
    [0]=> 
    string(64) "http://anthropology.school.com/stuff/anthropology.999.ug.courses" 
    [1]=> 
    string(14) "999.ug.courses" 
} 

但当我跑上面的代码(没有在文本):

$str ="http://anthropology.school.com/stuff/anthropology.888.ug.courses"; 

我:

array(0) { 
} 

这里是上面的代码live demo

0

如何:

preg_match('#^.+?/stuff/(?!.*999\.ug\.courses).*$#', $url)); 

你想要的网址是那些其匹配的正则表达式。

相关问题