部分文字列を含まない文字列を照合しようとしています
私の文字列は常に「http://www.domain.com/」で始まります
一致から除外したい部分文字列は、文字列(ドメイン名のフォルダー名)の後に続く「.a /」です。
除外したい部分文字列の後の文字列に文字が含まれます
例えば:
「http://www.domain.com/.a/test.jpg」は一致しないでください
ただし、「http://www.domain.com/test.jpg」は
そのような場合の私のアドバイスは、ネガティブな先読みアサーションなどで過度に複雑な正規表現を作成しないことです。
シンプルでバカにしてください!
2つの一致を実行します。1つはポジティブ用で、後でネガティブを分類します(またはその逆)。ほとんどの場合、簡単ではないにしても、正規表現は簡単になります。そして、あなたのプログラムはより明確になります。
たとえば、foobarではなくfooですべての行を抽出するには、次を使用します。
grep foo | grep -v foobar
先読みを使用せず、単純な正規表現を使用する場合は、ドメインと一致するが.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
は/
で終わらないため、テストに合格することに注意してください。
私は
^http:\/\/www\.domain\.com\/([^.]|\.[^a]).*$
ドメインに加えて、で継続しないすべてのものを一致させたい。そして、それが続くすべては。ただし、a
ではありません。 (最終的には/必要に応じて後で追加できます)