preg_replace не соответствует должным образом

Я знаю, что об этом спрашивали раньше, так как я только что читал эти ответы, но все еще не могу заставить это работать (правильно).

Я очень новичок в регулярных выражениях и пытаюсь сделать что-то, что звучит довольно просто:

Строка будет выглядеть так: http://www.something.com/section/filter/colour/red-

То, что я хотел бы сделать, это preg_replace, чтобы удалить -#?????? поэтому URL выглядит так: http://www.something.com/section/filter/colour/red/size/small/

Итак, я попробовал:

$string = $theURL;
$pattern = '/-\#(.*)\//i';
$replacement = '/';
$newURL = preg_replace($pattern, $replacement, $string);

Такого рода работы, но это не останавливает. Если у меня есть что-нибудь после -#?????? это также удаляет это также. Но я думал, что наличие / на конце остановит это?

Надеюсь, кто-то может помочь и спасибо за чтение

3 ответа

Решение

PCRE по умолчанию жадный, это означает, что .* будет соответствовать как можно большему чаку. Сделайте его неприличным, добавив U флаг (для всего шаблона) или использовать .*? (только для этой части шаблона):

/-\#(.*)\//iU

или же

/-\#(.*?)\//i

(.*) шаблон уже готов, что означает, что он будет соответствовать как можно большему числу символов. Чтобы сопоставить все с первой косой чертой, используйте (.*?):

$pattern = '/-\#(.*?)\//i';

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

$pattern = '/-\#(.*?)\//i';

Ваше регулярное выражение является жадным, что означает, что (.*)\/ ищет последний слэш, а не первый.

демонстрация

Другие вопросы по тегам