За последние 24 часа нас посетили 20203 программиста и 1006 роботов. Сейчас ищут 366 программистов ...

Найти 4 пробела в начале + оставшуюся строку

Тема в разделе "Регулярные выражения", создана пользователем MrDio, 19 май 2017.

  1. MrDio

    MrDio Новичок

    С нами с:
    19 май 2017
    Сообщения:
    21
    Симпатии:
    0
    Добрый день!
    В регулярных выражениях не профи и уже весь мозг сломал :-((.
    В цикле перебираются строчки:
    Код (Text):
    1.  
    2.     Title
    3.      Sub title
    4.     Super title
    5.      sub title super
    Т.е. некоторые содержат 4 пробела в начале, некоторые 5.
    Нужно найти только те, которые содержат 4 пробела в начале: "Title" и "Super title"
    пытаюсь вытащить
    Код (Text):
    1.  
    2. preg_match('/^\s{4}[a-zA-Z0-9]{3,}$/is', $mystring, $matches);
    в итоге тащится только "Title", что понятно, т.к. "Super title" содержит пробел.
    Меняю на
    Код (Text):
    1.  
    2. preg_match('/^\s{4}[a-zA-Z0-9\s]{3,}$/is', $mystring, $matches);
    в итоге тащатся все заголовки, что тоже в приниципе понятно.

    Непонятно как сделать так, чтобы тащились только "Title" и "Super title" а, те что содержат больше чем 4 пробела в начале игнорировались.

    Помогите пожалуйста!
     
  2. Emilien

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

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    По условию там строго пробел, а метасимвол \s это пробел, табуляция, символы новой строки и возврата каретки.
    PHP:
    1. $mystring = '
    2.    Title
    3.     Sub title
    4.    Super title
    5.     sub title super
    6. ';
    7.  
    8. preg_match_all('/^ {4}\w.*/m', $mystring, $matches);
    9.  
    10. var_dump($matches[0]);
     
    MrDio нравится это.
  3. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    если в цикле перебираются и если нужны просто эти строчки то можно же без регулярки обойтись? искать substr($txt, 0, 8) и проверять обрезанное)
     
    MrDio нравится это.
  4. MrDio

    MrDio Новичок

    С нами с:
    19 май 2017
    Сообщения:
    21
    Симпатии:
    0
    2Emilien, спасибо, да то что нужно!
    2Алекс8, спасибо! На самом деле, действительно можно было бы без регулярки обойтись, но вроде регулярка красивее. Там еще момент, что нужно только на английском искать, но вроде пока и так все нормально.
     
  5. Emilien

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

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Без регулярок.
    PHP:
    1. $array = [
    2. '    Title',
    3. '     Sub title',
    4. '    Super title',
    5. '     sub title super'
    6. ];
    7.  
    8. foreach ($array as $line) {
    9.     if (strspn($line, ' ') == 4 AND isset($line[4]) AND ctype_alnum($line[4])) {
    10.         echo $line, "\n";
    11.     }
    12. }
     
    Алекс8 и MrDio нравится это.
  6. MrDio

    MrDio Новичок

    С нами с:
    19 май 2017
    Сообщения:
    21
    Симпатии:
    0
    Да, прямо то что нужно! Благодорю!
     
  7. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    @Emilien клево)) я strspn, ctype_alnum никогда не использовал))