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
Форумы портала PHP.SU :: Версия для печати :: Замена символов в URL
Форумы портала PHP.SU » PHP » Регулярные выражения » Замена символов в URL

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

1. moroz11 - 01 Ноября, 2014 - 13:50:14 - перейти к сообщению
Получаю текущий URL:
$redi = substr(sefRelToAbs($_SERVER['REQUEST_URI']));

Он получается типа такой:
$redi = 'http://test.com/monitor/sadasdasd-23-0-67';

Нужно заменять символы в полученном URL после последнего тире на переменную.

Т.е. получить что-то наподобие
$redi = 'http://test.com/monitor/sadasdasd-23-0-$zamena';
где $zamena - переменная описанная отдельно.
2. jehaby - 05 Ноября, 2014 - 18:59:06 - перейти к сообщению
Некропост, ну да ладно:

$res = preg_replace('/([^-]*)$/', $sub, $redi);
3. dcc0 - 05 Ноября, 2014 - 23:28:51 - перейти к сообщению
Думаю "-" надо экранировать.
4. jehaby - 06 Ноября, 2014 - 21:46:13 - перейти к сообщению
Хм, тестил тут: http://regex101[dot]com/ , работало нормально.

Когда сейчас попробовал на PHP потестить, появился забавный баг, что с экранированием, что без:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. urf@urf-pc ~/trash $ php t2.php
  3. $redi ==  http://test.com/monitor/sadasdasd-23-0-
  4. $res == http://test.com/monitor/sadasdasd-23-0-42
  5. urf@urf-pc ~/trash $ php t2.php
  6. $redi ==  http://test.com/monitor/sadasdasd-23-0-33
  7. $res == http://test.com/monitor/sadasdasd-23-0-4242
  8. urf@urf-pc ~/trash $ php t2.php
  9. $redi ==  http://test.com/monitor/sadasdasd-23-0-7
  10. $res == http://test.com/monitor/sadasdasd-23-0-4242
  11. urf@urf-pc ~/trash $ php t2.php
  12. $redi ==  http://test.com/monitor/sadasdasd-23-0-345345435
  13. $res == http://test.com/monitor/sadasdasd-23-0-4242


Появляется на разных версиях PHP. Буду признателен, если кто объяснит в чем тут дело. Проблема вроде как решается изменением * на +.
5. Мелкий - 07 Ноября, 2014 - 10:06:35 - перейти к сообщению
jehaby, напишите листинг t2.php Я не очень понимаю, что есть что.
6. jehaby - 07 Ноября, 2014 - 17:10:26 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $redi = 'http://test.com/monitor/sadasdasd-23-0-345345435';
  4.  
  5. $sub = 42;
  6.  
  7. $res = preg_replace('/([^-]*)$/', $sub, $redi);
  8.  
  9. echo '$redi ==  ' . $redi . "\n";
  10. echo '$res == ' . $res . "\n";


Значение переменной $redi подставлял разное, видно в выводе из моего прошлого сообщения.
Пробовал на разных версиях PHP, и в консоли, и в браузере -- везде одно и то же.
7. Мелкий - 07 Ноября, 2014 - 19:28:42 - перейти к сообщению
Проблема решается позитивной ретроспективной проверкой. Утверждением, что перед совпадением должен быть символ "-"

Суть ошибки:
Машина регулярных выражений штука довольно тупая, она стартует с первого символа исходной строки, примеряет регулярное выражение. Если совпало - отлично, делает что надо. Если не совпало, перемещается на следующий символ и опять проверяет. И так, символ за символом движется к концу строки. (это общий алгоритм, ради производительности добавляются оптимизации, анализирующие регулярку и исключающие части стрики, точно не попадающие под неё)
До позиции последнего символа - проблем нет, регулярка не совпадает.
Затем:
В позиции -23-0-^345345435 маска [^-] совпадает. * - это ноль или больше совпадений; звёздочка жадная, сразу хапает всего всего и побольше до первого символа, не совпадающего с маской. И это оказывается конец строки - а он нам и нужен, совпадение всего выражения, меняем на 42.
Далее сюрприз: мы находимся в позиции -23-0-345345435^ (аккурат в конце строки). * - это ноль или больше совпадений. Что там дальше? Ага, конец строки, это нас устраивает. Регулярка совпала, меняем (ничего, пустую строку) на 42.
8. MAXUS - 08 Ноября, 2014 - 10:08:33 - перейти к сообщению
moroz11 пишет:
Нужно заменять символы в полученном URL после последнего тире на переменную.


PHP:
скопировать код в буфер обмена
  1. $redi = 'http://test.com/monitor/sadasdasd-23-0-345345435';
  2. // $redi = 'http://test.com/monitor/sadasdasd-23-0-';
  3.  
  4. $sub = 42;
  5. $default = 56;
  6.  
  7. $one = explode('-',$redi);
  8. $one[count($one)-1] = ($one[count($one)-1])?$sub:$default;
  9. $one = implode('-',$one);
  10.  
  11. $two = preg_replace('/-[^-]*$/', '-'.$sub, $redi);
  12.  
  13. $three =  substr_replace($redi,$sub,strrpos($redi,'-')+1);
  14.  
  15. echo '$redi ==  ' . $redi . "<br />";
  16. echo '$one == ' . $one . "<br />";
  17. echo '$two == ' . $two . "<br />";
  18. echo '$three == ' . $three . "<br />";


Три способа. Если раскомментировать вторую строку, то будет видно, что даже если в конце после тире пусто, то все равно произойдет замена. В первом способе сделана проверка на наличие символов после последнего тире. Если после тире url обрывается, то будет подставлено 56 (default), если после тире есть символы, то будет подставлено 42(sub).

Смысл в том, что регулярка - не единственный способ для такой простой задачи. И это отнюдь не все варианты, которыми можно представленную задачу выполнить.

 

Powered by ExBB FM 1.0 RC1