Поиск подстроки

Тема в разделе "PHP", создана пользователем LEXAlForpostl, 29 янв 2011.

Модераторы: latteo
  1. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    Здравствуйте.
    Помогите, пожалуйста, найти подстроку, которая начинается с первого символа в переменной $text и закончить поиск надо будет, когда закончится первые 3 слова, каждое из которых больше 3-х букв.
    Например:
    PHP:
    $text "РНР лучший в мире язык программирования";
    $iskomaya_podstroka "РНР лучший в мире";
     
  2. failometr

    failometr Постоялец

    Регистр.:
    30 апр 2009
    Сообщения:
    128
    Симпатии:
    45
    Где-то так.
    PHP:
    preg_match('#'.substr($text11).'\S*\s*(\S{3,})?\s*(\S{3,})?\s*(\S{3,})?#i'$stroka$matches)
    Но ваше утверждение по поводу
    Неверно.
     
  3. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    Вот такая замутка:
    PHP:
    $text "РНР лучший в мире язык программирования";
    $a   str_word_count($text1);
    $cw=0;
    foreach (
    $a as $key=>$word){
    if(
    $cw<3){
    $iskomaya_stroka.=$word." ";
    if(
    strlen($word)>=3){$cw++;}
    }}
    echo  
    rtrim($iskomaya_stroka);
    Выдаст именно "РНР лучший в мире"
    Если пробел в конце искомой строки не критичен, то функцией rtrim() можно пренебречь.
     
  4. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    В этом то и смысл. Если попадается слово меньше либо равно 3м буквам - продолжаем поиск.
     
  5. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    Ммм.... прошу прощения проморгал условие "меньше либо равно 3м буквам"... В таком случае в моём варианте необходимо убрать "=" из условия if(strlen($word)>=3){$cw++;} должен получиться скрипт:
    PHP:
    $text "РНР лучший в мире язык программирования"
    $a   str_word_count($text1); 
    $cw=0
    foreach (
    $a as $key=>$word){ 
    if(
    $cw<3){ 
    $iskomaya_stroka.=$word." "
    if(
    strlen($word)>3){$cw++;} 
    }} 
    echo  
    rtrim($iskomaya_stroka);  
    собственно изменяя значение переменной $cw в условии if($cw<3) и собственно условие if(strlen($word)>3) да ещё и добавляя дополнительные проверки можно издеваться над строками как угодно :)
     
  6. failometr

    failometr Постоялец

    Регистр.:
    30 апр 2009
    Сообщения:
    128
    Симпатии:
    45
    Тогда где-то так
    PHP:
    preg_match('#^'.substr($text,1,1).'\S{2,}\s{1,}(\S{1,2}\s{1,})*(\S{3,}\s{1,}(\S{1,2}\s{1,})*){2}|^'.substr($text,1,1).'\S{0,1}\s{1,}(\S{1,2}\s{1,})*(\S{3,}\s{1,}(\S{1,2}\s{1,})*){3}#i'$text$iskomaya_stroka);
    $iskomaya_stroka preg_replace('#(\s{1,}\S{1,2})*\s*$#i'''$iskomaya_stroka[0]); //чистим в конце лишние 1-2 символа и пробелы
    Учитываются слова больше или равно 3 символам. Как в примере с РНР лучший в мире, ведь "PHP" именно равно 3 символам, а не более.
    Вам бы больше примеров привести разных строк, с нужным результатом. Не обязательно реальные примеры, достаточно любой набор символов.
    \S считается все, что не пробельный символ, т.е. это и буквы и цифры и знаки препинания. Т.е. захват будет таким:
    Код:
    [B]P. лучший в. мире d! язык[/B][S] программирования[/S]
    или
    Код:
    [B]P., лучший в. мире[/B][S] d! язык программирования[/S]
    Для выключения точек из подсчета слов >=3 символов - нужно додумывать регулярку.

    Конечно работа с регулярками в принципе не очень-то оптимальна, но на мой взгляд в них проще менять условия + мозги включаются и не гниют :)
     
  7. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    Не отработал пример.

    Действительно. Это я ошибся, приводя пример.
    Прошу прощения у всех.
    Правильный ответ скрипта
    "РНР лучший в мире язык"
     
  8. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    То есть как
    ?
    Совсем не отработал или не правильно отработал?
    Перепроверено! Скрипт рабочий и в результате выводит фразу "РНР лучший в мире язык"
     
  9. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    Ничего не вывел скрипт.
    Сделал
    PHP:
    $text "РНР лучший в мире язык программирования";
    $a str_word_count($text1);
    var_dump ($a);
    $cw=0;
    Результат:
     
  10. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    Странно.... У меня конструкция:
    PHP:
    <?php
     $text 
    "РНР лучший в мире язык программирования";
    $a str_word_count($text1);
    print_r($a);
    $cw=0;
    foreach (
    $a as $key=>$word){
    if(
    $cw<3){
    $iskomaya_stroka.=$word." ";
    if(
    strlen($word)>3){$cw++;}
    }}
    echo 
    rtrim($iskomaya_stroka);
    ?>
    Выдаёт:
    Array ( [0] => РНР [1] => лучший [2] => в [3] => мире [4] => язык [5] => программирования ) РНР лучший в мире язык