Заменить строку между двумя слешами

1

Мне нужно изменить 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.

Теги:

4 ответа

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

Исходя из этого, вы можете сделать и для следующих вещей.

  • 0
    Спасибо. И если хотел бы соответствовать скороговорке также, когда это происходит от руки строки? как в / sc: r2342 / st: 1
  • 0
    Нашел. /st:(.*?)\/|\/st:(.*?)$/
Показать ещё 1 комментарий
3

Вы используете жадное соответствие . который соответствует любому символу.

Используйте более ограниченный шаблон:

preg_replace("/\/st:[^\/]*/",'',$string)

Класс < [^\/]* отрицанием символов соответствует только 0 или более символам, отличным от /.

Другое решение - использовать ленивое совпадение с *? квантификатор, но он не настолько эффективен, как с отрицательным классом символов.

ПОЛНОЕ ОПИСАНИЕ РЕЕКСА:

  • \/st: - literal /st:
  • [^\/]* - 0 или более символов, кроме /.
  • 1
    обратите внимание, что вам нужно удалить любой из слешей.
3

Вы можете использовать:

$string = preg_replace('~/st:[^/]*~','',$string);

[^/]* будет соответствовать только следующему /

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню