Совпадение всех персонажей после позитивного взгляда

Я пытался сделать правильное регулярное выражение для этого все утро, и я ударил стену. В следующей строке я не хочу соответствовать каждому слешу, который следует .com/<first_word> за исключением любого / после URL.

$string = "http://example.com/foo/12/jacket Input/Output";
match------------------------^--^

Длина слов между слешами не должна иметь значения.

Regex: (?<=.com\/\w)(\/) Результаты:

$string = "http://example.com/foo/12/jacket Input/Output"; // no match
$string = "http://example.com/f/12/jacket Input/Output";
matches--------------------^

Regex: (?<=\/\w)(\/) Результаты:

$string = "http://example.com/foo/20/jacket Input/O/utput"; // misses the /'s in the URL
matches----------------------------------------^
$string = "http://example.com/f/2/jacket Input/O/utput"; // don't want the match between Input/Output
matches--------------------^-^--------------^

Поскольку у вида сзади не может быть модификаторов, и оно должно быть утверждением нулевой длины, мне интересно, если я только что спустился по неверному пути и должен искать другую комбинацию регулярных выражений.

Является ли позитивный взгляд за правильным способом сделать это? Или я пропускаю что-то кроме обильного количества кофе?

НОТА: с тегом PHP потому что регулярное выражение должно работать в любой из preg_* функции.

7

Решение

Если вы хотите использовать preg_replace тогда это регулярное выражение должно работать:

$re = '~(?:^.*?\.com/|(?<!^)\G)[^/\h]*\K/~';
$str = "http://example.com/foo/12/jacket Input/Output";
echo preg_replace($re, '|', $str);
//=> http://example.com/foo|12|jacket Input/Output

Таким образом, заменяя каждый / по | после первого / появляется после запуска .com,

Отрицательный взгляд сзади (?<!^) необходимо, чтобы избежать замены строки без запуска .com лайк /foo/bar/baz/abcd,

RegEx Demo

3

Другие решения

использование \K здесь вместе с \G. захватить groups,

^.*?\.com\/\w+\K|\G(\/)\w+\K

Смотрите демо.

https://regex101.com/r/aT3kG2/6

$re = "/^.*?\\.com\\/\\w+\\K|\\G(\\/)\\w+\\K/m";
$str = "http://example.com/foo/12/jacket Input/Output";

preg_match_all($re, $str, $matches);

Replace

$re = "/^.*?\\.com\\/\\w+\\K|\\G(\\/)\\w+\\K/m";
$str = "http://example.com/foo/12/jacket Input/Output";
$subst = "|";

$result = preg_replace($re, $subst, $str);
3

Другая \G а также \K основанная идея.

$re = '~(?:^\S+\.com/\w|\G(?!^))\w*+\K/~';

Посмотреть демонстрацию на regex101

1
По вопросам рекламы [email protected]