Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP: регулярные выражения (поиск/замена)

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

2KiX



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Люди, помогите, пожалуйста...
В пхп замучился совсем решать такую вот задачку...
Надо в файле, в котором содержатся, помимо левой информации, еще названия станций метро.
Поскольку их вводят разные пользователи, то названия вводятся иногда с ошибками, поэтому уже написанный скрипт базы данных их не понимает.
 
Мне бы надо, наверное через ereg_replace заменить неверные имена станций на шаблонные.
 
И я вот никак не могут составить верное выражение, для замены, ну например, всех \\пр-т Вернадского// на \\Проспект Вернадского//
 
Спасибо заранее.

Всего записей: 9 | Зарегистр. 28-09-2004 | Отправлено: 00:46 28-09-2004
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2KiX

Цитата:
И я вот никак не могут составить верное выражение

а ты всегда знаешь, как могут выглядеть ошибки??

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 01:48 28-09-2004
Church



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
?
Цитата:
И я вот никак не могут составить верное выражение, для замены, ну например, всех \\пр-т Вернадского// на \\Проспект Вернадского//  
 

str_replace("пр-т Вернадского","Проспект Вернадского",$text);
 
Или тебе что-то такое надо:
preg_replace("/(.*)Вернадского/i","Проспект Вернадского",$text);

Всего записей: 1199 | Зарегистр. 05-09-2003 | Отправлено: 01:48 28-09-2004
2KiX



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Мне надо например, если первые 5 символов подряд в названии совпадают, то слово считается тем самым и будет заменено на заведомо правильное.
 
То есть из MySql достается слово и с ним сравнивается весь текст и по вышеприведенному правилу оно вставляется вместо тех слов с которыми найдено совпадение.
 
Но если например, там два слова типа пр-т Вернадского, то они оба меняются на шаблон проспект Вернадского.
 
Как выглядят ошибки я не знаю заведомо, поэтому предполагается что по минимальному сопвадению, например 5 букв подряд название считается узнанным и заменяется на правильное.

Всего записей: 9 | Зарегистр. 28-09-2004 | Отправлено: 01:53 28-09-2004
Church



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Как выглядят ошибки я не знаю заведомо, поэтому предполагается что по минимальному сопвадению, например 5 букв подряд название считается узнанным и заменяется на правильное.

Это придется перебирать все станции метро и регулярами проверять... Жутка...

Всего записей: 1199 | Зарегистр. 05-09-2003 | Отправлено: 02:10 28-09-2004
2KiX



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Это придется перебирать все станции метро и регулярами проверять... Жутка...

 
Ну придется - придется... Так если надо... Пусть железка трудится ей положено... Это ерунда как раз...
 
А вот с регулярными выражениями закавыка... ((

Всего записей: 9 | Зарегистр. 28-09-2004 | Отправлено: 02:17 28-09-2004
Church



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Ну придется - придется... Так если надо... Пусть железка трудится ей положено... Это ерунда как раз...  
 
А вот с регулярными выражениями закавыка... ((

 
Брр... Даже не представляю, как тут регуляры помогут...
 
Может это что даст?
 
<?php
$orig="Вернадского";
$text="пр-кт Вернадского";
$prov=substr($orig,0,5);
 
$pos = strpos($text,$prov);
if ($pos===false) {
print $text;
}
else {
print "проспект Вернадского";
}
?>
 
Добавлено
Или так...
 
<?php
$orig="Вернадского";
$text="пр-кт Вернадского";
$prov=substr($orig,0,5);
 
preg_match("/.*(".$prov.").*/i",$text,$t);
 
if (@$t[1]){
print "проспект Вернадского";
}
else {
print $text;
}
?>
 
 
Может кто что лучше посоветует... Я не знаю....... :ponder:

Всего записей: 1199 | Зарегистр. 05-09-2003 | Отправлено: 02:31 28-09-2004
cabron666



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
С регулярным выражением помочь не могу, но если данные вводятся через веб интерфейс, почему бы менюшку готовую не использовать? Типа
<select>
<option>Станция1</option>
<option>Станция2</option>
</select>

----------
Жизнь - это рояль, клавиша белая, клавиша черная, крышка...

Всего записей: 1342 | Зарегистр. 03-02-2002 | Отправлено: 03:20 28-09-2004
SiMM

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Мне надо например, если первые 5 символов подряд в названии совпадают, то слово считается тем самым и будет заменено на заведомо правильное.
Т.е. падежи тебе по барабану?

Всего записей: 2302 | Зарегистр. 14-05-2004 | Отправлено: 08:58 28-09-2004
2KiX



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо, Church, это очень похоже.
Но у меня более запущенный случай-
Посмотри, пожалуйста-
 
 
$txt="Речной вокзал/Фестивальная 8/2/1/3/32/5\Водный стадион/Пулковская 6/5/3/2/23/2\Пр-т Вернадского/Проспект Вернадского 3/2/1/4/36/1\\";
 
В принципе должно наверное получится что-то вроде -
 
$orig="Проспект Вернадского";
$str="Пр-т Вернадского";
$txt=ereg_replace ("$str","$orig",$txt);
 
Но это явно не подходит, поскольку я не уверен что ошибка будет именно такая. Поэтому в $str должно быть регулярное выражение.
 Да еще если бы надо было заменить одно слово, а то тут получается их как бы два Пр-т и Вернадского.
 
 
 
 
 
 
 

Всего записей: 9 | Зарегистр. 28-09-2004 | Отправлено: 10:05 28-09-2004
Kokoc

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а может, similar_text() использовать для нахождения наиболее близких вариантов?

similar_text("Проспект Вернадского","пр-т Вернадского",$proc) -> 77%
similar_text("Проспект Вернадского","Просп. Вернадского",$proc) ->89%
similar_text("Проспект Вернадского","Пр. Вернадского",$proc) ->80%
similar_text("Проспект Вернадского","проспект Вернадского",$proc) ->95%

и строки с % совпадения более 75% заменять.

Всего записей: 793 | Зарегистр. 06-06-2002 | Отправлено: 00:23 29-09-2004
2KiX



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
а может, similar_text

 
Да, интересное решение для поиска
А вот как заменять?..
 
Добавлено
<?php
$txt="Речной вокзал/Фестивальная 8/2/1/3/32/5\Водный стадион/Пулковская 6/5/3/2/23/2\Пр-т Вернадс/Проспект Вернадского 3/2/1/4/36/1\\";
$real_station="Проспект Вернадского";
$pattern="Верна";
echo $q=ereg_replace(".*".$pattern.".*",$real_station,$txt);
?>
 
Результат --  
Проспект Вернадского  
 
- а надо --
 
Речной вокзал/Фестивальная 8/2/1/3/32/5\Водный стадион/Пулковская 6/5/3/2/23/2\Проспект Вернадского/Проспект Вернадского 3/2/1/4/36/1\\
 
Какое регулярное выражение даст правильный результат?

Всего записей: 9 | Зарегистр. 28-09-2004 | Отправлено: 00:33 29-09-2004
Church



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Речной вокзал/Фестивальная 8/2/1/3/32/5\Водный стадион/Пулковская 6/5/3/2/23/2\Проспект Вернадского/Проспект Вернадского 3/2/1/4/36/1\\  
 
Какое регулярное выражение даст правильный результат?  

 

Цитата:
echo $q=ereg_replace(".*".$pattern.".*","Речной вокзал/Фестивальная 8/2/1/3/32/5\Водный стадион/Пулковская 6/5/3/2/23/2\".$real_station." 3/2/1/4/36/1\\ ",$txt);  

?

Всего записей: 1199 | Зарегистр. 05-09-2003 | Отправлено: 21:27 29-09-2004
2KiX



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
?  

 
Ну чего... Я пытаюсь написать регулярку... И пишу что получается из моего эксперимента в броузере. И спрашиваю что написать вместьо моего неправильного регулярного выражения.
 
Вот тут еще раз пытался вот таким образом-
 
<?php
$txt="Речной вокзал/Фестивальная 8/2/1/3/32/5\Водный стадион/Пулковская 6/5/3/2/23/2\Пр-т Вернадс/Проспект Вернадского 3/2/1/4/36/1\\";
$real_station="Проспект Вернадского";
$pattern="Верна";
echo $q=ereg_replace("\\[a-zA-Z0-9 -.а-яА-Я]*".$pattern."[a-zA-Z0-9 -.а-яА-Я]*\/","\\".$real_station."\/",$txt);
?>
 
 
И опять ничего не получается...
То есть получается:
 
Речной вокзал/Фестивальная 8/2/1/3/32/5\Водный стадион/Пулковская 6/5/3/2/23/2\Пр-т Вернадс/Проспект Вернадского 3/2/1/4/36/1\
 
Ну а это не то естественно...

Всего записей: 9 | Зарегистр. 28-09-2004 | Отправлено: 00:26 30-09-2004
Church



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2KiX
<?php
$txt="Речной вокзал/Фестивальная 8/2/1/3/32/5\Водный стадион/Пулковская 6/5/3/2/23/2\Пр-т Вернадс/Проспект Вернадского 3/2/1/4/36/1\\";  
$real_station="Проспект Вернадского";  
$pattern="Верна";
print preg_replace("/[А-Яа-я -]*".$pattern."[А-Яа-я -]*/i",$real_station,$txt);
?>

Всего записей: 1199 | Зарегистр. 05-09-2003 | Отправлено: 01:38 30-09-2004
2KiX



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
О, большое спасибо...
В самый раз...
 
Напоследок еще вопросец, если не трудно...
А как мне обозначить символ ввода (возврата каретки) в регулярном выражении?..
(В windows)
 
Еще раз огромное спасибо...

Всего записей: 9 | Зарегистр. 28-09-2004 | Отправлено: 00:45 01-10-2004 | Исправлено: 2KiX, 01:02 01-10-2004
Church



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
А как мне обозначить символ ввода (возврата каретки) в регулярном выражении?..  

 
\n - не работает?

Всего записей: 1199 | Зарегистр. 05-09-2003 | Отправлено: 17:29 01-10-2004 | Исправлено: Church, 17:31 01-10-2004
2KiX



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
\n - не работает?

 
Спасибо, все разобрался...
Это я совсем обленился...
Нашел в сети...
 Работает - \r?\n

Всего записей: 9 | Зарегистр. 28-09-2004 | Отправлено: 23:43 02-10-2004
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2KiX

Цитата:
Работает - \r?\n

для виндов \r\n
для никса.. просто \n

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 00:14 03-10-2004
Svarga

Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery

Цитата:
для никса.. просто \n

В Мозилле и под Виндой просто \n
 
2KiX

Цитата:
 Работает - \r?\n

Была уже где-то тема по поводу переводов строк...
Не будет работать, если ввод текста на макинтоше делался: там новая строка — просто \r


----------
away.

Всего записей: 4161 | Зарегистр. 25-06-2002 | Отправлено: 02:13 03-10-2004
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP: регулярные выражения (поиск/замена)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru