Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: удаление повторяющихся слешей
----- Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
movEAX
Отправлено: 04 Января, 2011 - 20:19:23
Частый посетитель
Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009
Помог: 16 раз(а)
Двойные кавычки в регулярках - зло!
Если планируется использовать символ, который обозначает границы регулярного выражения,то разумнее всего заменить его другим символом.
'#^http://[^/]*(/){2,}#'
Можно узнать содержимое переменной $url? Возможно есть более простые решения.
----- армия.. самое убогое место
Champion
Отправлено: 04 Января, 2011 - 20:26:33
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
preg_replace("#(?<!^http:)/{2,}#i","/",$url);
JustUserR
Отправлено: 04 Января, 2011 - 21:20:20
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Саныч пишет:
Нужно удалить повторяющиеся слеши из url...
Для осуществления удаления групп вхождения элементов представленных в требуемом количство возможно использование упрощенной функции строковой замены - в частности процесс удаления групп последовательных элементов может осуществяться в виде замены N+1 компонетов на N осуществляемое до тех пор пока такая замена является допустимой
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Саныч
Отправлено: 04 Января, 2011 - 21:44:53
Участник
Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010 Откуда: Украина, Запорожье
Помог: 62 раз(а)
movEAX, такую я и сам написал, но она не работает
В $url у меня содежится адресс, к примеру http://site.ru/bla1/bla2//bla3/blaN... Так вот нужно удалить все повторяющееся слеши, естественно кроме первых двух...
Champion, спасибо, работает... Но возникли вопросы...
1) можете расшифровать вот эту часть ?<!^ А еще лучше ссылку на статейку, где подобное подробно изложено...
2) если мне кроме / нужно еще что-то заменять, т.е. нужна группа символов, допустим такая [/&/_]... Вобщем можете подробно разложить эту регулярку, т.к. я ее совсем не могу понять...
----- Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
movEAX
Отправлено: 04 Января, 2011 - 21:54:38
Частый посетитель
Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009
Помог: 16 раз(а)
Можно даже попроще тогда написать
'#(?<!:)/{2,}#'
Цитата:
Утверждения касательно предшествующего текста начинаются с (?<= для положительных утверждений и (?<! для отрицающих. Например, (?<!foo)bar не найдёт вхождения "bar", которым не предшествует "foo".
----- армия.. самое убогое место
Tonik992
Отправлено: 05 Января, 2011 - 03:42:24
Новичок
Покинул форум
Сообщений всего: 19
Дата рег-ции: Июнь 2010
Помог: 0 раз(а)
(?<!foo)bar не найдёт вхождения "bar", которым не предшествует "foo".
Как это понять? Я запутался. ?<! - отрицательное утверждение, как вы говорите.
Получается, что не найдет bar, которым ПРЕДШЕСТВУЕТ foo.
Только что проверил, так и есть.
в строке foobar не найдет bar, т.к. есть foo.
----- Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
JustUserR
Отправлено: 06 Января, 2011 - 01:58:28
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Саныч В действительности осуществление решения предполагаемой в данном потоке обсуждения задачи может быть произведено достатоно простыми средствами на основе следующего алгоритма - в анализируемой строковой константе обеспечивается поиск последовательных элементов образующих искомое влождение длины N+1 и производится его замены на аналогичное выражение длины N - с осуществлением выполнение указанных действий приводящих изменение оригинальной анализируемой строки
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Champion
Отправлено: 06 Января, 2011 - 08:35:49
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
(?<!foo)bar не найдёт вхождения "bar", которым не предшествует "foo".
Как это понять?
Да, одно "не" тут лишнее) Опечатка)
JustUserR
Отправлено: 06 Января, 2011 - 21:40:23
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
В анализируемой строковой константе обеспечивается поиск последовательных элементов образующих искомое влождение длины N+1 и производится его замены на аналогичное выражение длины N - с осуществлением выполнение указанных действий приводящих изменение оригинальной анализируемой строки
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
movEAX
Отправлено: 07 Января, 2011 - 09:01:06
Частый посетитель
Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009
Помог: 16 раз(а)
В ссылках слеш в другую сторону
----- армия.. самое убогое место
Champion
Отправлено: 07 Января, 2011 - 09:29:16
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
JustUserR аж 3 раза повторил свою умную фразу, и всё-таки решил кодом подкрепить.
Тогда вопросы по коду:
1 - зачем заборы в двойных кавычках?
2 - почему этот код меняет 3 слеша на 2?
3 - что за слово repeatins ?
4 - зачем использовать while(true) с if в конце? Есть замечательная конструкция do - while
5 - Этот код будет выполняться медленнее одного прег-реплейса и использует лишнюю переменную. В чем его плюсы?
В общем, ужасный код.
И опять прошу: уважай участников форума, пиши запятые!
JustUserR
Отправлено: 07 Января, 2011 - 20:59:47
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Champion пишет:
Зачем заборы в двойных кавычках?
В случае необходимости установки в строковой константе элемента обратного слеша требуется использования обязательного их предшествующего экранирования - по этой причине применение константы в двойных и одинарных кавычках не предоставяет никакой разницы
Champion пишет:
Почему этот код меняет 3 слеша на 2?
Процесс многократного повторения операции замены N+1 вхождений последовательно повторяющихся элементов на N - производит решения оригинальной задачи
Champion пишет:
что за слово repeatins
repeating - то есть повторяющиеся обратные слеши
Champion пишет:
Зачем использовать while(true) с if в конце? Есть замечательная конструкция do - while
Точка выхода из данного бесконечного цикла определяется исключительно в процесс выполнения повторяющихся замен - по этой причине использование цикла do while обеспечивает исключительно добавление одной лишней итерации
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.