Форум программистов, компьютерный форум, киберфорум
PHP: RegExp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 28
1

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

31.10.2015, 11:42. Показов 2447. Ответов 4

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

Замену пытался делать с помощью функции 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.10.2015, 11:42
Ответы с готовыми решениями:

ЧПУ - регулярные выражения
Кто разбирается в регулярных выражениях подскажите как прописать в htaccess следующее: есть ...

Как Использовать регулярные выражения
Вычитал что есть какие то регулярные выражения, попробовал использовать их на практике но ничего не...

Лексический анализатор - как использовать регулярные выражения?
Вот код анализатора. Как использовать регулярные выражение? И мне нужно разделить идентификатор...

Сравнение строк как регулярные выражения
Подскажите с виду такая простая задача. Сравнить к примеру строку "temp_" со строкой...

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 на чпу ссылки (из базы данных )

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

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
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
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 28
05.11.2015, 20:10  [ТС] 5
Решил проблему по своему. Наконец то дошло до меня как Спасибо за помощь!
0
05.11.2015, 20:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2015, 20:10
Помогаю со студенческими работами здесь

Как правильно проверять поля формы на регулярные выражения?
Надо чтобы в поле ввели что угодно кроме цифр. Использую регулярку: "~+~" <form...

Про регулярные выражения, как правильно вытащить значение
Есть у меня данные, так выдает прибор. Мне нужно взятяь одно значение. Вот сам текст ...

Регулярные выражения. Замена
Всем привет)Продолжаю разбираться в регулярных выражениях и не получается сделать следующее......

Регулярные выражения, Замена
Доброго времени суток. Все же столкнулся с регулярками (не люблю их по причине того, что не умею...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru