Подтвердить что ты не робот

Строка regex не содержит подстроку

Я пытаюсь сопоставить строку, которая не содержит подстроку

Моя строка всегда начинается "http://www.domain.com/"

Подстрока, которую я хочу исключить из совпадений, это ".a/", которая появляется после строки (имя папки в доменном имени)

Будут символы в строке после подстроки, которую я хочу исключить

Например:

"http://www.domain.com/.a/test.jpg" не следует сопоставлять

Но "http://www.domain.com/test.jpg" должно быть

4b9b3361

Ответ 1

Используйте отрицательное утверждение в виде:

^http://www\.domain\.com/(?!\.a/).*$

Рублевая ссылка

Часть (?!\.a/) соответствует чему-либо, кроме .a/

Ответ 2

Мой совет в таких случаях заключается не в том, чтобы создавать чрезмерно сложные регулярные выражения с отрицательными утверждениями взгляда или такими вещами.
Держите его простым и глупым!
Сделайте 2 совпадения, один для положительных, и затем соберите негативы (или наоборот). В большинстве случаев регулярные выражения становятся проще, если не тривиальны. И ваша программа становится понятной.
Например, чтобы извлечь все строки с помощью foo, но не foobar, я использую:

grep foo | grep -v foobar

Ответ 3

Я бы попробовал

^http:\/\/www\.domain\.com\/([^.]|\.[^a]).*$

Вы хотите совместить свой домен, а также все, что не продолжается с помощью. и все, что продолжается, с. но не a. (В конце концов вы можете добавить вас/если необходимо после)

Ответ 4

Если вы не используете внешний вид, а просто простое регулярное выражение, вы можете просто сказать, если он соответствует вашему домену, но не соответствует с .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 пройдет тест, потому что он не заканчивается на /.