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

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

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

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

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

например:

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

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

4 ответов


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

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

Rubular Link

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


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

grep foo | grep -v foobar

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

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

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


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