[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: preg_match
Droff
Здравствуйте. Сразу извиняюсь за неграмотную речь, с php недавно знаком. sad.gif

Задача такая: Нужно организовать поиск выражения по текстовому файлу и на выходе показать, есть совпадение или нет. Поиск должен быть "точным", т.е. если вводим "123", а в файле есть выражение "1234" и нет "123", то функция давала FALSE.

$zapros=$_POST['zapros'];
$filed=file_get_contents($file);
if (preg_match("/\b$zapros\b/i", $filed))
{
print(’Есть’);
}
else
{
print(’Нет’);
}

В итоге, скрипт не находит некоторые выражения из файла. Например:"привет", "букет", все слове заканчивающиеся на "ет" и еще несколько выражений(абсолютно не связанных друг с другом). В чем парадокс не пойму blink.gif
Текстовый файлик сохранен в utf-8.
Заранее спасибо tongue.gif



Спустя 1 час, 10 минут, 25 секунд (28.01.2010 - 20:03) Droff написал(а):

if(stristr($filed,$zapros))echo($zapros." найден!");
else echo($zapros." не найден!");

В таком варианте проблем с неопределением некоторых выражений нет, то тогда идет поиск подстроки, а нужно точное совпадение...
Возможно сюда можно подставить претензию \B - не на границе слова, но как пока не знаю smile.gif

Спустя 1 час, 35 минут, 29 секунд (28.01.2010 - 21:38) twin написал(а):
Чем определяются критерии поиска? Слова? Слова можно вычленять по пробелам, переносам строки, знакам препинания...
Поточнее сформулируй задачу.

Спустя 3 часа, 10 минут, 31 секунда (29.01.2010 - 00:49) Droff написал(а):
искомое выражение состоит из букв и(или) цифр(уникальный номер). В файле каждый номер на отдельной строке.
Например, в искомом файле есть 2 номера: УН5012, ЖД5012.
Так вот, если пользователь вводит "5012", то функция должна вернуть FALSE, т.к. совпадение неточное.


Спустя 1 час, 12 минут, 43 секунды (29.01.2010 - 02:01) twin написал(а):
Ну вот. Главное - сформулировать вопрос. Теперь немного подумаем и получим алгоритм.
1. Читаем файл построчно в массив (функция file())
2. Находим значение в массиве функцией array_search().
Это если нужно узнать, на какой строчке. А если только присутствие, то вообще просто - in_array()

Спустя 7 часов, 27 минут, 28 секунд (29.01.2010 - 09:29) Droff написал(а):
Спасибо конечно, но видимо я туплю... sad.gif
В итоге получилось:

$filed=file('1.txt');
if (in_array($_POST['zapros'],$filed))
{
echo "найдено.";
}
else
{
echo "Не найдено.";
}

мой файлик:

привет
прив
123
1234
приветик
priv
pri

Ничего не находит кроме последнего элемента массива. Файл сохранен в кодировке utf-8.

Спустя 30 минут, 39 секунд (29.01.2010 - 10:00) Droff написал(а):
Нашел ответ тут
Поиск полезная штука.

$filed=file('date.txt');

$date=$_POST['zapros'];

//забъем $filed в цикл, чтобы проверить каждое значение массива
$temp=count($filed)-1;
for($i=$temp; $i>=0; $i--)
{

//немножко обработаем
$per=$$filed[$i];
$per=trim($per);

//проверяем и определяем есть ли good ответ
if($date==$per) {$goodotvet="ДА!";}
else{$badotvet="НЕТ!";}

}

Но первый элемен все равно отказывается искать smile.gif

//выведем good ответ (если он есть) либо bad ответ
if($goodotvet){echo $goodotvet;}
else{echo $badotvet;};



Спустя 47 минут, 29 секунд (29.01.2010 - 10:47) twin написал(а):
Не нужно все усложнять.

<?php

$filed = array_map('trim', file('1.txt'));

if (in_array($_POST['zapros'], $filed))
echo "найдено.";
else
echo "Не найдено.";

А первое слово не ищет... могу предположить, что файл делался блокнотом. Скорее всего это BOM, первые три байта. Сделай файл другим редактором или прямо скриптом:
<?php

file_put_contents('1.txt',
'привет
прив
123
1234
приветик
priv
pri'
);

Спустя 2 часа, 30 минут, 32 секунды (29.01.2010 - 13:18) Droff написал(а):
Спасибо огромное за помощь, все работает user posted image

Спустя 16 минут, 49 секунд (29.01.2010 - 13:34) FatCat написал(а):
// Заменяем все НЕ буквы или цифры на пробелы, плюс пробелы в начало и конец:
$filed = preg_replace("#^[[:alnum:]]#"," "," ".$filed." ");
// Заменяем переводы строк на пробелы
$filed = str_replace(PHP_EOL," ",$filed);

// Ищем точные вхождения, обрамляя искомое слово пробелами:
if( stristr($filed,$_GET['zapros']) )echo "Найдено";
else echo "Не найдено";
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.