2012-02-25 2 views
1

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

Im очень новой для Regex, и я пытаюсь сделать что-то, что звучит довольно просто:

Строка будет: http://www.something.com/section/filter/colour/red-#998682/size/small/

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

Так я пробовал:

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

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

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

ответ

1

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

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

или

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

wow благодарит всех за быстрые ответы. Это сработало отлично. Подождите несколько минут, пока он не позволит мне выбрать ответ. Еще раз спасибо :) – fl3x7

1

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

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

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

demo

1

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

$pattern = '/-\#(.*?)\//i'; 
Смежные вопросы