【发布时间】:2011-07-22 21:35:45
【问题描述】:
我正在尝试匹配一个不包含子字符串的字符串
我的字符串总是以“http://www.domain.com/”开头
我要从匹配项中排除的子字符串是“.a/”,它位于字符串(域名中的文件夹名称)之后
字符串中我要排除的子字符串后面会有字符
例如:
“http://www.domain.com/.a/test.jpg”不应匹配
但是“http://www.domain.com/test.jpg”应该是
【问题讨论】:
我正在尝试匹配一个不包含子字符串的字符串
我的字符串总是以“http://www.domain.com/”开头
我要从匹配项中排除的子字符串是“.a/”,它位于字符串(域名中的文件夹名称)之后
字符串中我要排除的子字符串后面会有字符
例如:
“http://www.domain.com/.a/test.jpg”不应匹配
但是“http://www.domain.com/test.jpg”应该是
【问题讨论】:
【讨论】:
在这种情况下,我的建议是不要使用负面的前瞻性断言或类似的东西来构建过于复杂的正则表达式。
保持简单和愚蠢!
做 2 场比赛,一场是正面的,然后再整理出负面的(或反之亦然)。大多数时候,正则表达式变得更容易,即使不是微不足道的。
您的程序会变得更清晰。
例如,要提取所有带有 foo 而不是 foobar 的行,我使用:
grep foo | grep -v foobar
【讨论】:
我会尝试
^http:\/\/www\.domain\.com\/([^.]|\.[^a]).*$
您想要匹配您的域,以及所有不以 .一切都以 a 继续。但不是a。 (最终你可以添加你/如果需要的话)
【讨论】:
如果您不使用前瞻,而只是使用简单的正则表达式,您可以说,如果它与您的域匹配但与 .a/ 不匹配
<?php
function foo($s) {
$regexDomain = '{^http://www.domain.com/}';
$regexDomainBadPath = '{^http://www.domain.com/\.a/}';
return preg_match($regexDomain, $s) && !preg_match($regexDomainBadPath, $s);
}
var_dump(foo('http://www.domain.com/'));
var_dump(foo('http://www.otherdomain.com/'));
var_dump(foo('http://www.domain.com/hello'));
var_dump(foo('http://www.domain.com/hello.html'));
var_dump(foo('http://www.domain.com/.a'));
var_dump(foo('http://www.domain.com/.a/hello'));
var_dump(foo('http://www.domain.com/.b/hello'));
var_dump(foo('http://www.domain.com/da/hello'));
?>
注意http://www.domain.com/.a 将通过测试,因为它不会以/ 结尾。
【讨论】: