Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Парсинг строки
 
 автор: technic611   (16.05.2012 в 20:23)   письмо автору
 
 

Помогите найти подстроку без использования встроенных функций обработки строк.

  Ответить  
 
 автор: Красная_шляпа   (16.05.2012 в 22:26)   письмо автору
 
   для: technic611   (16.05.2012 в 20:23)
 

каких именно? если всех, то тупо циклом перебираешь, алгоритм http://ru.wikipedia.org/wiki/Алгоритм_Кнута_—_Морриса_—_Пратта http://algolist.manual.ru/search/esearch/kmp.php

  Ответить  
 
 автор: technic611   (16.05.2012 в 22:31)   письмо автору
 
   для: Красная_шляпа   (16.05.2012 в 22:26)
 

я думаю нужно написать подобие функций strpos и strlen. Вы пример дали это что вообще?

  Ответить  
 
 автор: Красная_шляпа   (16.05.2012 в 22:56)   письмо автору
 
   для: technic611   (16.05.2012 в 22:31)
 

http://ru.wikibooks.org/wiki/Примеры_реализации_алгоритма_Кнута_—_Морриса_—_Пратта решение твоей задачи, на php перепиши и всё

  Ответить  
 
 автор: technic611   (16.05.2012 в 23:20)   письмо автору
 
   для: Красная_шляпа   (16.05.2012 в 22:56)
 

strlen нельзя применять и все строковые функции

  Ответить  
 
 автор: Красная_шляпа   (16.05.2012 в 23:44)   письмо автору
 
   для: technic611   (16.05.2012 в 23:20)
 

те дали алгоритм сиди разбирай, не тупи

  Ответить  
 
 автор: technic611   (17.05.2012 в 00:02)   письмо автору
 
   для: Красная_шляпа   (16.05.2012 в 23:44)
 

в примерах присутствует функция strlen ()

  Ответить  
 
 автор: confirm   (17.05.2012 в 00:07)   письмо автору
 
   для: technic611   (17.05.2012 в 00:02)
 

<?
$str 
'string';
$i 0;
$cmp 'r';
$pos = -1;
while(@
$str[$i]) {
  if(
$str[$i]==$cmp && $pos<0$pos $i;
  
$i++;  
}
echo 
$pos;

Добавляйте проход по $cmp, сравнивая ее индексы и корректируя $pos.

  Ответить  
 
 автор: technic611   (17.05.2012 в 12:03)   письмо автору
 
   для: confirm   (17.05.2012 в 00:07)
 

а если искать "ri" работать не будет

  Ответить  
 
 автор: confirm   (17.05.2012 в 12:14)   письмо автору
 
   для: technic611   (17.05.2012 в 12:03)
 

Все будет, если дописать условия. Во-первых нужно добавить счетчик для вхождения которое ищем. Во-вторых - увеличивать его, если найдено совпадение для него, и сбрасывать если следующее сравнение ложное. В третьих - соответственно этим условиям сбрасывать позицию. Что-то типа такого. Думайте, вам ведь надо.

  Ответить  
 
 автор: technic611   (17.05.2012 в 17:00)   письмо автору
 
   для: confirm   (17.05.2012 в 12:14)
 

спасибо. сделал так.
подскажите, как сделать проверку если между строк тире, запятая. как создать массив и его просканить

<? 
function search($str$cmp)
{

$i 0
$pos = -1;
$vhod=0;
 
while(@
$str[$i]) { 
  if(
$str[$i]==$cmp[0] && $pos<$vhod

{

$pos $i

     




$k=$i;
while(@
$cmp[$k]) 



if(
$cmp[$k]==true || $cmp[$k]==" ")
{

if(
$str[$pos+$k]==$cmp[$k]) $pos $pos;
else 
$vhod=$pos+1

}
$k++;
}


}
$i++;
}

echo 
"Подстрока найдена на позиции: $pos";
}


$str 'irrirgyyyihoiirrgyu  ytrew'
$cmp 'trew'

search ($str$cmp);

?>

  Ответить  
 
 автор: confirm   (17.05.2012 в 17:06)   письмо автору
 
   для: technic611   (17.05.2012 в 17:00)
 

Как вы такой код читаете, все по левому краю и отступов ноль? )

В смысле точка, запятая... не учитывать или просто проверять? Опять не используя строковых функций?
Массив чего?

  Ответить  
 
 автор: technic611   (17.05.2012 в 17:44)   письмо автору
 
   для: confirm   (17.05.2012 в 17:06)
 

в блокноте писал.
массив такой
array(',', '-', '_') 
проверка вместо этого
if($cmp[$k]==true || $cmp[$k]==" ")


масив можно прогнать и проверить на разделители строк, только как? и что скажете насчет кода, правильный он или нет...

  Ответить  
 
 автор: confirm   (17.05.2012 в 18:16)   письмо автору
 
   для: technic611   (17.05.2012 в 17:44)
 

Не запускал вашего кода я, я его даже прочесть не могу, не знаю где остановка )
Проверьте его в всех ситуациях, вот и ответ будет, правильный он или нет.

Если сверять с тем, что в массиве, тогда достаточно in_array(). Вот только что-то я не пойму - эти символы такие же равноценные как и абвгд..., и если они участвуют в поиске, то зачем их выделять особо? Если не участвуют, то тогда я смысла поиска не понимаю.

  Ответить  
 
 автор: technic611   (17.05.2012 в 22:17)   письмо автору
 
   для: confirm   (17.05.2012 в 18:16)
 

ой да, действительно, достаточно проверки на пробел )))

  Ответить  
 
 автор: Красная_шляпа   (17.05.2012 в 14:12)   письмо автору
 
   для: technic611   (17.05.2012 в 12:03)
 



<?php 

$search 
'611'
$haystack 'technic611 - ololol xddd lolka'

$pos false;
$i 0;

while (@
$c $haystack[$i]) { 
    if (
$c == $search[0]) { 
        
$pos $i;        
        
$j 0;
        
$k 1;
        
        while (@
$c1 $search[++$j]) {          
            if (
$c1 == $haystack[++$i]) { 
                ++
$k;
            } 
        } 
         
        if (
$j == $k) { 
            break; 
        } 
         
        
$pos false
    } 
    
    ++
$i;


if (
$pos === false) {  
    echo 
'Ne naideno'
}
else { 
    echo 
'Stroka do iskomoi podstroki: ' substr($haystack0$pos); 
}

?>



тебе решение написали ниже, не уж то нельзя чуть-чуть доделать?

  Ответить  
 
 автор: Красная_шляпа   (17.05.2012 в 01:15)   письмо автору
 
   для: technic611   (17.05.2012 в 00:02)
 

строка в пэхэпэ тож самое что и массив! По ней также можно циклом прохадиться и т.д. strlen == count

  Ответить  
 
 автор: confirm   (17.05.2012 в 01:17)   письмо автору
 
   для: Красная_шляпа   (17.05.2012 в 01:15)
 

Вы так думаете?

  Ответить  
 
 автор: Красная_шляпа   (17.05.2012 в 01:41)   письмо автору
 
   для: confirm   (17.05.2012 в 01:17)
 

я думаю, что я ничо не думаю

  Ответить  
 
 автор: confirm   (17.05.2012 в 01:47)   письмо автору
 
   для: Красная_шляпа   (17.05.2012 в 01:41)
 

Строка никогда не была и не будет массивом, можно обращаться к элементам строки по индексу (смещению), но это не значит, что она массив. А поэтому, не являясь таковым, а также объектом, и переданная в качестве аргумента в функцию count, будет возвращать всегда 1.

  Ответить  
 
 автор: Красная_шляпа   (17.05.2012 в 01:42)   письмо автору
 
   для: technic611   (17.05.2012 в 00:02)
 



<?php

$search 
str_split('olk');
$haystack str_split('technic611 - ololol xddd lolka');

$l1 count($haystack);
$l2 count($search);

$pos false;
for (
$i 0$i $l1; ++$i) {
    if (
$haystack[$i] == $search[0]) {
        
$pos $i;
        
        
$k 0;
        while (++
$k $l2) {         
            if (
$haystack[++$i] != $search[$k]) {
                break;
            }
        }
        
        if (
$k == $l2) {
            break;
        }
        
        
$pos false;
    }
}

if (
$pos) {
    echo 
'Stroka do iskomoi podstroki: ' implode(array_slice($haystack0$pos));
}
else {
    echo 
'Ne naideno';
}

echo 
'<br><br><br><br>';

?>

  Ответить  
 
 автор: confirm   (17.05.2012 в 01:45)   письмо автору
 
   для: Красная_шляпа   (17.05.2012 в 01:42)
 

Товарищ упоминал, что никаких функций работы со строками нельзя применять.

  Ответить  
 
 автор: Красная_шляпа   (17.05.2012 в 01:47)   письмо автору
 
   для: confirm   (17.05.2012 в 01:45)
 

дооо с собачками сделает

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования