Мне нужно изменить URL-адрес следующим образом:
$string = "/st:1/sc:RsrlYQhSQvs=/fp:1/g:3/start:2015-07-01/end:2015-07-30";
А именно, я хочу удалить st:1
с регулярным выражением. Я использовал:
preg_replace("/\/st:(.*)\//",'',$string)
но я получил
end:2015-07-30
в то время как я хотел бы получить:
/sc:RsrlYQhSQvs=/fp:1/g:3/start:2015-07-01/end:2015-07-30
То же самое, если я хотел бы удалить fp:1
.
Вам нужно добавить ?
в вашем регулярном выражении: -
<?php
$string = "/st:1/sc:RsrlYQhSQvs=/fp:1/g:3/start:2015-07-01/end:2015-07-30";
echo preg_replace("/\/st:(.*?)\//",'',$string)
?>
Выход: - https://eval.in/397658
Исходя из этого, вы можете сделать и для следующих вещей.
Вы используете жадное соответствие .
который соответствует любому символу.
Используйте более ограниченный шаблон:
preg_replace("/\/st:[^\/]*/",'',$string)
Класс < [^\/]*
отрицанием символов соответствует только 0 или более символам, отличным от /
.
Другое решение - использовать ленивое совпадение с *?
квантификатор, но он не настолько эффективен, как с отрицательным классом символов.
ПОЛНОЕ ОПИСАНИЕ РЕЕКСА:
\/st:
- literal /st:
[^\/]*
- 0 или более символов, кроме /
.Вы можете использовать:
$string = preg_replace('~/st:[^/]*~','',$string);
[^/]*
будет соответствовать только следующему /
Вместо использования regex здесь вы должны сделать синтаксические функции для вашей специальной строки форматирования, они просты, им не нужно долго писать, и они сделают вашу жизнь намного проще:
function readPath($path) {
$parameters = array();
foreach(explode('/', $path) as $piece) {
// Here we make sure we have something
if ($piece == "") {
continue;
}
// This here is just a fancy way of splitting the array returned
// into two variables.
list($key, $value) = explode(':', $piece);
$parameters[$key] = $value;
}
return $parameters;
}
function writePath($parameters) {
$path = "";
foreach($parameters as $key => $value) {
$path .= "/" . implode(":", array($key, $value));
}
return $path;
}
Теперь вы можете просто работать над ним как с php-массивом, в этом случае вы бы пошли:
$parameters = readPath($string);
unset($parameters['st']);
$string = writePath($parameters);
Это делает гораздо более читаемый и многоразовый код, кроме того, поскольку большую часть времени вы имеете дело только с небольшими вариациями этого формата, вы можете просто менять разделители каждый раз или даже абстрагировать эти функции на использование разных разделителей.
Другой способ справиться с этим - преобразовать строку в соответствие с обычным запросом пути, используя что-то вроде:
function readPath($path) {
return parse_str(strtr($path, "/:", "&="));
}
В вашем случае, хотя, поскольку вы используете символ "=" в URL-адресе, вам также потребуется URL-адрес для кодирования каждого значения, чтобы не противоречить формату, однако для этого был бы использован аналогичный структурированный код.