За последние 24 часа нас посетили 19707 программистов и 1381 робот. Сейчас ищут 726 программистов ...

найти слово и окружающие его

Тема в разделе "Регулярные выражения", создана пользователем Versoul, 27 июл 2009.

  1. Versoul

    Versoul Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    41
    Симпатии:
    0
    в общем стоит задача в тексте найти слово и слово справа отнего и слева от него(как бы словосочетание) вот параметр передается из формы в пост, вот такая регулярка у меня вышла
    Код (Text):
    1. "/[a-z]+?".$_POST["what"]."[a-z]+?/"
    работает норм находит слово целиком если передается пара букв из этого слова, а мне нужно еще найти слова которые его окружают дописал значит вот так
    Код (Text):
    1. "/[^|\s]?(.+?)[\s]?[a-z]+?".$_POST["what"]."[a-z]+?[\s]?(.+?)[\s|$]/"
    и значит правое слово берет правильно именно одно слово а слева(перед параметром) не слово до пробела а до начала строки, то есть 2 3 или больше слов, помогите с этим, не понимаю.что я сделал не так
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
  3. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Попробуйте так:
    Код (Text):
    1. '/([\w]+ ' .preg_quote( $_POST['what']) .' [\w]+)/'
     
  4. Versoul

    Versoul Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    41
    Симпатии:
    0
    и как это поможет? у меня не обрабатывает правильно почемут начало, покажи как должна выглядеть регулярка
     
  5. Versoul

    Versoul Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    41
    Симпатии:
    0
    neverlose не катит массив пустой...
     
  6. Versoul

    Versoul Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    41
    Симпатии:
    0
    вношу подробности есть 4 файла... текст всех по очереди "vasya go up" "vasya go down" "petya + vasya = down" "petya down vasya"
    с моей регуляркой "/[^|\s]?(.+?)[\s]?[a-z]+?".$_POST["what"]."[a-z]+?[\s]?(.+?)[\s|$]/"
    вот такой вывод
    Array ( [0] => vasya go [1] => v [2] => go ) Array ( [0] => vasya go [1] => v [2] => go ) Array ( [0] => petya + vasya = [1] => etya + [2] => = ) Array ( [0] => petya down vasya [1] => etya down [2] => )
     
  7. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    PHP:
    1. <pre>
    2. <?php
    3. $Phrases = array(
    4.     'vasya go up',
    5.     'vasya go down',
    6.     'petya + vasya = down',
    7.     'petya down vasya'
    8. );
    9.  
    10. $_POST['what'] = 'go';
    11.  
    12. foreach( $Phrases as $Phrase)
    13. {
    14.     preg_match_all('/([\w]+ ' .preg_quote( $_POST['what']) .' [\w]+)/', $Phrase, $matches);
    15.     echo 'Phrase: ' .$Phrase .'<br />Array: ' .print_r( $matches, true) .'<br /><br />';
    16. }
    17. ?>
    18. </pre>
    Код (Text):
    1. Phrase: vasya go up
    2. Array: Array
    3. (
    4.     [0] => Array
    5.         (
    6.             [0] => vasya go up
    7.         )
    8.  
    9.     [1] => Array
    10.         (
    11.             [0] => vasya go up
    12.         )
    13.  
    14. )
    15.  
    16.  
    17. Phrase: vasya go down
    18. Array: Array
    19. (
    20.     [0] => Array
    21.         (
    22.             [0] => vasya go down
    23.         )
    24.  
    25.     [1] => Array
    26.         (
    27.             [0] => vasya go down
    28.         )
    29.  
    30. )
    31.  
    32.  
    33. Phrase: petya + vasya = down
    34. Array: Array
    35. (
    36.     [0] => Array
    37.         (
    38.         )
    39.  
    40.     [1] => Array
    41.         (
    42.         )
    43.  
    44. )
    45.  
    46.  
    47. Phrase: petya down vasya
    48. Array: Array
    49. (
    50.     [0] => Array
    51.         (
    52.         )
    53.  
    54.     [1] => Array
    55.         (
    56.         )
    57.  
    58. )
     
  8. Versoul

    Versoul Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    41
    Симпатии:
    0
    у меня preg_match("/([\w]+ ".preg_quote( $_POST['what'])." [\w]+)/",$str,$arr); возвращает пустые 4 массива. просто видимо из-за того,что у тебя все переменные в строках а у меня в файл записаны. попробуй плз создать 4 файла и записать в них эти строки(все в утф-8)
     
  9. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Чему равен Ваш $_POST['what'] ?
     
  10. Versoul

    Versoul Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    41
    Симпатии:
    0
    разные значения передаю. обычно sy или vasya
     
  11. Versoul

    Versoul Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    41
    Симпатии:
    0
    могу показать сам скрипт если на этот форум можно приатачивать файлы
     
  12. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Передайте "go".

    sy и vasya - таких слов, после которого и перед которым шло бы слово - нету.
     
  13. Versoul

    Versoul Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    41
    Симпатии:
    0
    не катит. могу ли я как либо показать файлы чтобы конкретней было видно что и где я ступил? оч прошу
     
  14. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Можете ли Вы - я не знаю, но я Вам это разрешаю. Вы можете скопировать содержание файлов в следующий пост. Только, пожалуйста, заключите код в ббкод PHP.
     
  15. Versoul

    Versoul Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    41
    Симпатии:
    0
  16. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
  17. Versoul

    Versoul Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    41
    Симпатии:
    0
    neverlose этот код срабатывает если запрос на поиск целое слово, а мне же еще нужно чтоб и часть по сти искала например sy из vasya находило то же что и vasya и еще не работает с русс буквами
     
  18. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    С этого и надо было начинать.
    PHP:
    1. preg_match("/([\w]* ?[\w]*".preg_quote( $_POST['what'])."[\w]* ?[\w]*)/",$str,$arr);
     
  19. Versoul

    Versoul Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    41
    Симпатии:
    0
    neverlose вот так отлично получилось,только не работает с русскими запросами, подскажи уже до конца пожалуйста
     
  20. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    кодировка?
     
  21. Versoul

    Versoul Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    41
    Симпатии:
    0
  22. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
  23. Versoul

    Versoul Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    41
    Симпатии:
    0
    как в последнем примере рус не находит а англ находит с ошибками =( то есть нужно вернуться к предпоследнему варианту
     
  24. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Попробуйте добавить модификаторы iu
    PHP:
    1. /$pattern/iu
     
  25. cypok

    cypok Активный пользователь

    С нами с:
    2 авг 2009
    Сообщения:
    9
    Симпатии:
    0
    Код (Text):
    1. [a-z]+?
    что обозначает такая конструкция? с [a-z]+ всё ясно, а какую нагрузку несёт "?"