За последние 24 часа нас посетили 16624 программиста и 1681 робот. Сейчас ищут 919 программистов ...

REGEXP '[^0-9]*({$poisk})[^0-9]*'

Тема в разделе "PHP и базы данных", создана пользователем sumsum, 29 сен 2014.

  1. sumsum

    sumsum Новичок

    С нами с:
    13 май 2014
    Сообщения:
    96
    Симпатии:
    0
    Почему запрос REGEXP '[^0-9]*({$poisk})[^0-9]*' в выдаче выдает при $poisk=100
    1000458 ведь я же указал, что дальше не должны идти цифры [^0-9]*
     
  2. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Ну, он у вас нашел 100, а что там раньше и позже - ему по барабану. Он нашел строку, которая удовлетворяет его условию - "100".
    Смотрите просмотр вперед и назад
     
  3. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    [^0-9]* - звездочка значит "0 и более". Вот ноль и сработал.
     
  4. sumsum

    sumsum Новичок

    С нами с:
    13 май 2014
    Сообщения:
    96
    Симпатии:
    0
    Что то я запутался. правильно ли я переписал регулярное выражение?
    (![^0-9])({$poisk})(![^0-9])
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Начало и конец строки попробуй обозначь
     
  6. neverlose

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

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Я думаю, что у Вас просто код неверный. Например, фигурные скобки и переменная в одинарных кавычках (апострофах) не парсятся и рассматриваются как обычная строка.

    Код (Text):
    1. <?php
    2. // где ищем
    3. $source = 'abc 100458 bca';
    4.  
    5. // то, что ищем
    6. $poisk = 100;
    7.  
    8. // поисковый запрос может измениться, поэтому лучше проэкранировать в нём спецсимволы регулярного выражения
    9. $poisk = preg_quote($poisk, '/');
    10.  
    11. /*
    12.  \\ - это экранированный \
    13.  \D - в регулярном выражении, означает все кроме цифр, аналог [^0-9]
    14.   \\D* - последовательность символов, исключая цифры, длиной от 0 до бесконечности
    15. */
    16. $regexp = '/\\D*(' . $poisk . ')\\D*/';
    17.  
    18. if (preg_match($regexp, $source, $matches)) {
    19.     echo 'В подстроке "' . $matches[0] . '" найден искомый элемент "' . $matches[1] .'"';
    20. } else {
    21.     echo 'Не удалось найти';
    22. }
    23. ?>
    Результат работы скрипта:
    Код (Text):
    1. В подстроке "abc 100" найден искомый элемент "100"
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Да почему. У него 100 находит. Дальше и перед - не цифры могут быть или не быть. Всё соответствует.
     
  8. qwermus

    qwermus Новичок

    С нами с:
    27 окт 2014
    Сообщения:
    21
    Симпатии:
    0
    Ты все правильно написал, только вместо звездочек поставь плюс.
    Код (Text):
    1.  REGEXP '[^0-9]+({$poisk})[^0-9]+'
    Выше ответ уже дали - звездочка значит, что может быть 0 и более символов, т.е. их может и не быть.
    Плюс означает, что должен быть хотя бы один символ.
    Я думаю, в твоем случае правильнее было бы даже не плюс поставить, а обозначить границы, т.е.:
    Код (Text):
    1.  REGEXP '^[^0-9]*({$poisk})[^0-9]*$'