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';
Ваше регулярное выражение является жадным, что означает, что (.*)\/
ищет последний слэш, а не первый.