Я пытался сделать правильное регулярное выражение для этого все утро, и я ударил стену. В следующей строке я не хочу соответствовать каждому слешу, который следует .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_*
функции.
Если вы хотите использовать 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
,
использование \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);
Другая \G
а также \K
основанная идея.
$re = '~(?:^\S+\.com/\w|\G(?!^))\w*+\K/~';
(:
группа без захвата установить точка входа ^\S+\.com/\w
или же клеевые спички \G(?!^)
к этому.\w*+\K/
властно соответствует любому количеству символов слова до косой черты. \K
перезагружается матч.