Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр 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($haystack, 0, $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($haystack, 0, $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 Яндекс.Метрика Яндекс цитирования