Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: RegExp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
sergiu920
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 26
1

ЧПУ. Замена строк, регулярные выражения. Как правильно использовать переменную в регулярные выражения ?

31.10.2015, 11:42. Просмотров 618. Ответов 4

Здравствуйте! Решил реализовать ЧПУ на своем сайте. Первый этап это замена всех реальных ссылок на чпу ссылки. Так вот при замене я столкнулся с проблемой.

Замену пытался делать с помощью функции str_replace но проблема в том что она заменяет ранее вставленное значение.

То есть реальная ссылка /?view=article&id=1 заменяется чпу ссылкой /html/izobrazheniya-v-html.html ( ПРАВИЛЬНО )
а ссылка /?view=article&id=10 заменяется той же чпу ссылкой /html/izobrazheniya-v-html.html ( НЕ ПРАВИЛЬНО. Она должна заменяется вот этой чпу ссылки: /html/kak-sozdat-html-stranitsu.html), и в итоге получается вот такая неправильная чпу ссылка: /html/izobrazheniya-v-html.html0.

То есть происходит именно то что описано в справочнике в замечании.
Так как str_replace() осуществляет замену слева направо, то при использовании множественных замен она может заменить ранее вставленное значение на другое.

Для решении проблемы решил воспользоваться функцией preg_replace() но здесь возникла другая проблема, с регулярной выражению.

Вот как выглядит регулярное выражение для поиска ссылок вида /?view=article&id=[значение] :
PHP
1
$pattern = '/\/\?view=article&id='.$only_id.'/';
Вместо названии переменной $only_id вставляется ее значение. В итоге ничего не тронулась с места. По прежднему появляется неправильная чпу ссылка: /html/izobrazheniya-v-html.html0.

Посмотрел на регулярное выражение и подумал поставить знак доллара в конце чтобы указать конец строки
PHP
1
$pattern = '/\/\?view=article&id='.$only_id.'$/';
но в результате происходит какое то ошибка и замена вообще не осуществляется.

Как решить проблему чтобы ссылка вида /?view=article&id=10 не заменялось значением ссылки /?view=article&id=1. То есть чтобы в результате не было неправильной чпу ссылки /html/izobrazheniya-v-html.html0 а правильная чпу ссылка
/html/kak-sozdat-html-stranitsu.html ?

Всем спасибо!

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2015, 11:42
Ответы с готовыми решениями:

Регулярные выражения: замена нескольких одинаковых знаков препинания на одно
Здравствуйте! Помогите с регулярным выражениям имеется текст, после чистки от...

Как работают регулярные выражения?
Здравствуйте, только начал изучать регулярные выражения PCRE. И не могу найти...

php и регулярные выражения? Как выделить ссылки?
ну все как у людей должно быть, допустим если введена ссылка: www.google.ru...

Как вставить смайлик в окно чата? (регулярные выражения)?
вот код смайлика: <A HREF="javascript:insertsmile('<1>')"><IMG SRC="1.gif"...

Как подсветить найденные цифры в тексте, используя регулярные выражения
При помощи регулярных выражений надо выделить все цифры синим цветом. Помогите...

4
kolesnikov
15 / 15 / 10
Регистрация: 23.03.2013
Сообщений: 101
31.10.2015, 12:32 2
Нефига не понял если честно, но вот регулярка для вашего случая \?view=article&id=(\d+) запомнит id статьи,
опишите точнее проблему лучше с примером кода
0
sergiu920
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 26
31.10.2015, 14:37  [ТС] 3
Есть страница раздела со статьями и нужно заменить все реальные ссылки вида /?view=article&id=1 на чпу ссылки (из базы данных )

Запрос на получение ЧПУ ссылки из БД:

PHP
1
$article_alias = $this->article->getField("alias", "link", $link);

Все ЧПУ ссылки получаю из базы данных с помощью метода getField. Данный метод позволяет узнать значение какого то поля по определенному полю и его значению.
В данном случае мне нужно узнать значение поля alias ( содержит название чпу ссылок ) по полю link ( содержит название реальных ссылок, типа /?view=article&id=1 ) и его значению которое содержится в переменной $link.

Так как замена происходит в цикле то поочередно в переменную $article_alias попадает Чпу ссылки.

В массиве $matches[2][$i] находятся строка с реальной ссылкой которая существует на странице и которую нужно заменять на чпу ссылку.

В переменную $content находится весь код страницы.

В этот кусок кода происходит замена всех найденных ссылок типа /?view=article&id=1 на чпу ссылки
PHP
1
$content = str_replace($matches[2][$i], $article_alias, $content);
Например :
/?view=article&id=1 заменяется на /html/izobrazheniya-v-html.html
/?view=article&id=2 заменяется на /html/blok-div-i-gorizontalnaya-liniya-hr.html
/?view=article&id=8 заменяется на /html/abzatsy-v-html-i-atribut-vyravnivaniya.html
и так далее.
Проблема возникает при замене ссылки /?view=article&id=10 на /html/kak-sozdat-html-stranitsu.html.

Потому что в этой ссылки /?view=article&id=10 присутствует полностью первая ссылка то есть /?view=article&id=1.

Так как str_replace() осуществляет замену слева направо, то при использовании множественных замен ( как в моем случае ) заменяется ранее вставленное значение.

Для ясности:
/?view=article&id=1 заменяется на /html/izobrazheniya-v-html.html
/?view=article&id=10 заменяется на /html/izobrazheniya-v-html.html0
То есть в строку /?view=article&id=10 существует подстрока /?view=article&id=1 и не заменяется полностью вся строка ( /?view=article&id=10 ) а только ее часть /?view=article&id=1. И в итоге получается такая неправильная ЧПУ ссылка html/izobrazheniya-v-html.html0, обратите внимание что она с 0 в конце, который остается при замене.

ЧПУ. Замена строк, регулярные выражения. Как правильно использовать переменную в регулярные выражения ?


Так вот как сделать чтобы заменялась полностью вся строка /?view=article&id=10 на чпу ссылку /html/kak-sozdat-html-stranitsu.html ?
0
kolesnikov
15 / 15 / 10
Регистрация: 23.03.2013
Сообщений: 101
31.10.2015, 15:37 4
Самый простой вариант
$content = str_replace($matches[2][$i].'"', $article_alias.'"', $content);

Добавлено через 4 минуты
Вариант по красивее
PHP
1
2
3
4
5
6
7
8
$text = '/?view=article&id=1 gffdg /?view=article&id=10';
$pattern = '/\?view=article&id=\d+/';
$matches = [];
preg_match_all($pattern, $text, $matches);
if (count($matches))
foreach($matches[0] as $m):
 
endforeach;
0
sergiu920
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 26
05.11.2015, 20:10  [ТС] 5
Решил проблему по своему. Наконец то дошло до меня как Спасибо за помощь!
0
05.11.2015, 20:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2015, 20:10

Регулярные выражения. Как сделать, чтобы из названия программ отрезалась версия?
Здравствуйте! Никак я не могу освоить регулярные выражения :) Вот несколько,...

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

Регулярные выражения
Здравствуйте есть такое код ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru