|
|
|
| Здравствуйте. Вот поставила в тупик простая задача сравнения строк. Нужно всего лишь сравнить введённую в text box фразу с фразой в базе. Причём без учёта регистра и пробелов
Делаю так
$str='дом гроза';
if(isset($_POST['text']))
{
$str=strtolower($str);
$cmp=explode(" ",$_POST['text']);
for($l=0;$l<count($cmp);$l++) $cmp[$l]=trim($cmp[$l]);
$_POST['text']=implode(" ",$cmp);
$_POST['text']=strtolower($_POST['text']);
if($str==$_POST['text'])echo "swdsfewfef";
}
|
Ввожу после этого дом гроза
Равенства почему-то нет. Не могу разобраться, Помогите, если не трудно
Спасибо
Кстати, если вводить дом гроза, т.е. с тремя пробелами, strlen показывает, что пробелы как были, так и остались | |
|
|
|
|
|
|
|
для: shest
(25.11.2010 в 22:11)
| | Выводите содержимое переменных.
Не работайте вслепую. | |
|
|
|
|
|
|
|
для: Trianon
(25.11.2010 в 22:25)
| | Вывожу, но они идентичны. Браузер не покажет пробелов между словами. Зато длина фраз разная не смотря на обработку. Основная проблема- убрать лишние пробелы между словами, чтобы адекватно сравнить, а они не убираются почему-то :( | |
|
|
|
|
|
|
|
для: Shest
(25.11.2010 в 22:31)
| | выводите значения внутри цикла. Вместе с индексом цикла.
поймете, что происходит, - можно будет говорить о том, как выкручиваться. | |
|
|
|
|
|
|
|
для: Trianon
(25.11.2010 в 22:44)
| | Уф, понял, что происходит. При таком раскладе $cmp=explode(" ",$_POST['name']); все пробелы попадают в массив
Я побаиваюсь регулярных выражений, поэтому получилось следующее
<? $str='дом гроза';
if(isset($_POST['name']))
{
$cmp1=array();
$str=strtolower($str);
$cmp=explode(" ",$_POST['name']);
for($l=0;$l<count($cmp);$l++)
{
if($cmp[$l]=="") continue;
$cmp1[]=$cmp[$l];
}
$_POST['name']=implode(" ",$cmp1);
$_POST['name']=strtolower($_POST['name']);
if($str==$_POST['name'])echo "swdsfewfef";
}
?>
| Огромное всем спасибо | |
|
|
|
|
|
|
|
для: Shest
(25.11.2010 в 23:12)
| | >Уф, понял, что происходит. При таком раскладе $cmp=explode(" ",$_POST['name']); все пробелы попадают в массив
не в массив, а скорее, между пустыми элементами массива.
Вам же более подошел бы вариант
<?
do
{
$str1 = $str0;
$str0 = str_replace(" ", " ", $str1);
}while($str0 != $str1);
|
Между прочим, многие постоянно спрашивают, зачем do-while?
Вот пример, зачем. | |
|
|
|
|
|
|
|
для: Trianon
(25.11.2010 в 23:14)
| | Да, верно. Просто не ожидал, что так будет. Потом print_r() посмотрел и ... | |
|
|
|
|
|
|
|
для: Shest
(25.11.2010 в 23:17)
| | и кстатии str_replace конечно много чего может. Но с регулярками стоит таки завести дружбу. Иногда очень помогает. | |
|
|
|
|
|
|
|
для: shest
(25.11.2010 в 22:11)
| | Вам, наверное, лучше сначала убрать лишние пробелы(заменить несколько пробелов на один), а уже после сравнивать.
<?
$str='дом гроза';
if(isset($_POST['text'])){
$str=strtolower($str);
$_POST['text']=strtolower($_POST['text']);
$a = str_replace(preg_match("/[\s]+/",$_POST['text'])," ",$_POST['text']);
if($str==$a)echo "swdsfewfef";
}
|
| |
|
|
|
|
|
|
|
для: Лена
(25.11.2010 в 23:02)
| | оно, конечно лучше, да только тогда тредстартер не поймет, что в его коде происходило.
И кстати, перезаписывать значения суперглобальных массивов после их исходного заполнения - дурной тон.
В сложном коде вообще не поймешь, что было на входе, а что позже вычислено. | |
|
|
|