正则表达式:排除某些字符串,但包括其他
我有此链接:正则表达式:排除某些字符串,但包括其他
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)
谢谢。
如果这些是你需要匹配的唯一的东西,这个表达式应该做的(在Perl格式):
/http:\/\/anthropology.school.com(\/\w+\/(?<!\/stuff\/)\w*)|(\/stuff\/anthropology\.999\.ug\.courses)/
它首先无论是命名为任何目录,但相匹配的URL的开头,然后东西或/stuff/anthropropology.999.ug.courses。
其实我必须拥有它,以便开始时以负号表示排除信号。比方说,我只给了你这个: -/stuff/anthropology.999.ug.courses基本上说,排除/stuff/anthropology.999.ug.courses我希望它与ONLY/stuff /的任何链接都被忽略。但是如果它在链接中有999.ug.courses,那么我有我的答案。事情是,我必须在表达式前使用减号( - )。谢谢 – Mike 2011-05-06 18:37:48
请确保您在域中避开点,以便它们不匹配随机字符。 – 2011-05-06 18:46:26
好点Ates!我记得他们的最后部分虽然... :) – Kaivosukeltaja 2011-05-06 19:38:05
您正在寻找条件子模式评估。下面的正则表达式应该为你工作:
~.*?(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。
如何:
preg_match('#^.+?/stuff/(?!.*999\.ug\.courses).*$#', $url));
你想要的网址是那些其不匹配的正则表达式。
你能发布更多示例网址吗?你总是只想要“999.ug.courses”部分的网址吗? – 2011-05-06 17:05:05