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 :: удаление повторяющихся слешей

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
Саныч
Отправлено: 04 Января, 2011 - 19:30:02
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




нужно удалить повторяющиеся слеши из url...
использую такую регулярку, но не работает, где-то ошибка...
PHP:
скопировать код в буфер обмена
  1. $url = preg_replace("/^http\:\/\/[^\/]*([\/]){2,}/","$1",$url);


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
movEAX
Отправлено: 04 Января, 2011 - 20:19:23
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009  


Помог: 16 раз(а)




Двойные кавычки в регулярках - зло!
Если планируется использовать символ, который обозначает границы регулярного выражения,то разумнее всего заменить его другим символом.
'#^http://[^/]*(/){2,}#'
Можно узнать содержимое переменной $url? Возможно есть более простые решения.


-----
армия.. самое убогое место
 
 Top
Champion Супермодератор
Отправлено: 04 Января, 2011 - 20:26:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




preg_replace("#(?<!^http:)/{2,}#i","/",$url);
 
 Top
JustUserR
Отправлено: 04 Января, 2011 - 21:20:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Саныч пишет:
Нужно удалить повторяющиеся слеши из url...
Для осуществления удаления групп вхождения элементов представленных в требуемом количство возможно использование упрощенной функции строковой замены - в частности процесс удаления групп последовательных элементов может осуществяться в виде замены N+1 компонетов на N осуществляемое до тех пор пока такая замена является допустимой


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Саныч
Отправлено: 04 Января, 2011 - 21:44:53
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




movEAX, такую я и сам написал, но она не работает
В $url у меня содежится адресс, к примеру http://site.ru/bla1/bla2//bla3/blaN... Так вот нужно удалить все повторяющееся слеши, естественно кроме первых двух...

Champion, спасибо, работает... Но возникли вопросы...
1) можете расшифровать вот эту часть ?<!^ А еще лучше ссылку на статейку, где подобное подробно изложено...
2) если мне кроме / нужно еще что-то заменять, т.е. нужна группа символов, допустим такая [/&/_]... Вобщем можете подробно разложить эту регулярку, т.к. я ее совсем не могу понять... Растерялся


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
movEAX
Отправлено: 04 Января, 2011 - 21:54:38
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009  


Помог: 16 раз(а)




Можно даже попроще тогда написать
'#(?<!:)/{2,}#'
Цитата:
Утверждения касательно предшествующего текста начинаются с (?<= для положительных утверждений и (?<! для отрицающих. Например, (?<!foo)bar не найдёт вхождения "bar", которым не предшествует "foo".


-----
армия.. самое убогое место
 
 Top
Tonik992
Отправлено: 05 Января, 2011 - 03:42:24
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Июнь 2010  


Помог: 0 раз(а)




(?<!foo)bar не найдёт вхождения "bar", которым не предшествует "foo".
Как это понять? Я запутался. ?<! - отрицательное утверждение, как вы говорите.
Получается, что не найдет bar, которым ПРЕДШЕСТВУЕТ foo.
Только что проверил, так и есть.
в строке foobar не найдет bar, т.к. есть foo.
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $url = "foobarfoobarfoobar";
  3. preg_match_all("#(?<!foo)bar#i",$url,$n);
  4. print_r($n);
  5. /*
  6. Array
  7. (
  8.     [0] => Array
  9.         (
  10.         )
  11.  
  12. )
  13.  
  14. */
  15. ?>

Соответственно, если поменять паттерн на ?<= то получаем оправданный результат:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. /*
  4.             [0] => bar
  5.             [1] => bar
  6.             [2] => bar
  7. */
  8. ?>
  9.  

(Отредактировано автором: 05 Января, 2011 - 03:46:15)

 
 Top
movEAX
Отправлено: 05 Января, 2011 - 09:35:41
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009  


Помог: 16 раз(а)




Tonik992 пишет:
Как это понять? Я запутался. ?<! - отрицательное утверждение, как вы говорите.

Это не я так говорю, это в доках написано) Судя по всему, вы все поняли правильно.


-----
армия.. самое убогое место
 
 Top
Саныч
Отправлено: 05 Января, 2011 - 10:40:48
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




Tonik992, вот я нашел по этому поводу... Написано как-то недоходчиво, но на примерах все сразу понятно становится http://ru[dot]wikipedia[dot]org/wiki/Рег[dot][dot][dot]0[dot]B7[dot]D0[dot]B0[dot]D0[dot]B4


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
JustUserR
Отправлено: 06 Января, 2011 - 01:58:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Саныч В действительности осуществление решения предполагаемой в данном потоке обсуждения задачи может быть произведено достатоно простыми средствами на основе следующего алгоритма - в анализируемой строковой константе обеспечивается поиск последовательных элементов образующих искомое влождение длины N+1 и производится его замены на аналогичное выражение длины N - с осуществлением выполнение указанных действий приводящих изменение оригинальной анализируемой строки


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Champion Супермодератор
Отправлено: 06 Января, 2011 - 08:35:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Саныч http://www.php.su/lessons/?lesson_17 - вот ссылка. А как это работает, уже объяснили.
Tonik992 пишет:
(?<!foo)bar не найдёт вхождения "bar", которым не предшествует "foo".
Как это понять?
Да, одно "не" тут лишнее) Опечатка)
 
 Top
JustUserR
Отправлено: 06 Января, 2011 - 21:40:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




В анализируемой строковой константе обеспечивается поиск последовательных элементов образующих искомое влождение длины N+1 и производится его замены на аналогичное выражение длины N - с осуществлением выполнение указанных действий приводящих изменение оригинальной анализируемой строки
PHP:
скопировать код в буфер обмена
  1. $str; // string with repeatins slashes
  2. while(true)
  3. {$nw_str=str_replace("\\\\\\","\\\\",$str);
  4. if(strlen($nw_str)==strlen($str)) {break;}
  5. else {}
  6. }


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
movEAX
Отправлено: 07 Января, 2011 - 09:01:06
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009  


Помог: 16 раз(а)




В ссылках слеш в другую сторону Улыбка


-----
армия.. самое убогое место
 
 Top
Champion Супермодератор
Отправлено: 07 Января, 2011 - 09:29:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




JustUserR аж 3 раза повторил свою умную фразу, и всё-таки решил кодом подкрепить.
Тогда вопросы по коду:
1 - зачем заборы в двойных кавычках?
2 - почему этот код меняет 3 слеша на 2?
3 - что за слово repeatins ?
4 - зачем использовать while(true) с if в конце? Есть замечательная конструкция do - while
5 - Этот код будет выполняться медленнее одного прег-реплейса и использует лишнюю переменную. В чем его плюсы?
В общем, ужасный код.

И опять прошу: уважай участников форума, пиши запятые!
 
 Top
JustUserR
Отправлено: 07 Января, 2011 - 20:59:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 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/
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB