0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 28
|
|||||||||||
1 | |||||||||||
ЧПУ. Замена строк, регулярные выражения. Как правильно использовать переменную в регулярные выражения ?31.10.2015, 11:42. Показов 2447. Ответов 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=[значение] :
Посмотрел на регулярное выражение и подумал поставить знак доллара в конце чтобы указать конец строки
Как решить проблему чтобы ссылка вида /?view=article&id=10 не заменялось значением ссылки /?view=article&id=1. То есть чтобы в результате не было неправильной чпу ссылки /html/izobrazheniya-v-html.html0 а правильная чпу ссылка /html/kak-sozdat-html-stranitsu.html ? Всем спасибо!
0
|
31.10.2015, 11:42 | |
Ответы с готовыми решениями:
4
ЧПУ - регулярные выражения Как Использовать регулярные выражения Лексический анализатор - как использовать регулярные выражения? Сравнение строк как регулярные выражения |
15 / 15 / 10
Регистрация: 23.03.2013
Сообщений: 101
|
|
31.10.2015, 12:32 | 2 |
Нефига не понял если честно, но вот регулярка для вашего случая \?view=article&id=(\d+) запомнит id статьи,
опишите точнее проблему лучше с примером кода
0
|
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 28
|
|||||||||||
31.10.2015, 14:37 [ТС] | 3 | ||||||||||
Есть страница раздела со статьями и нужно заменить все реальные ссылки вида /?view=article&id=1 на чпу ссылки (из базы данных )
Запрос на получение ЧПУ ссылки из БД:
Все ЧПУ ссылки получаю из базы данных с помощью метода getField. Данный метод позволяет узнать значение какого то поля по определенному полю и его значению. В данном случае мне нужно узнать значение поля alias ( содержит название чпу ссылок ) по полю link ( содержит название реальных ссылок, типа /?view=article&id=1 ) и его значению которое содержится в переменной $link. Так как замена происходит в цикле то поочередно в переменную $article_alias попадает Чпу ссылки. В массиве $matches[2][$i] находятся строка с реальной ссылкой которая существует на странице и которую нужно заменять на чпу ссылку. В переменную $content находится весь код страницы. В этот кусок кода происходит замена всех найденных ссылок типа /?view=article&id=1 на чпу ссылки
/?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
|
15 / 15 / 10
Регистрация: 23.03.2013
Сообщений: 101
|
||||||
31.10.2015, 15:37 | 4 | |||||
Самый простой вариант
$content = str_replace($matches[2][$i].'"', $article_alias.'"', $content); Добавлено через 4 минуты Вариант по красивее
0
|
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 28
|
|
05.11.2015, 20:10 [ТС] | 5 |
Решил проблему по своему. Наконец то дошло до меня как Спасибо за помощь!
0
|
05.11.2015, 20:10 | |
05.11.2015, 20:10 | |
Помогаю со студенческими работами здесь
5
Как правильно проверять поля формы на регулярные выражения? Про регулярные выражения, как правильно вытащить значение Регулярные выражения. Замена Регулярные выражения, Замена Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |