строка 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/).*$
часть (?!\.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
пройдет тест, потому что он не заканчивается на /
.