Взять строку до n запятой или другого знака

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

Статус темы:
Закрыта.
Модераторы: xpert13
  1. RedRabbit

    RedRabbit

    Регистр.:
    11 июл 2008
    Сообщения:
    606
    Симпатии:
    251
    Сегодня столкнулся с проблемой. Был текст вида:
    Код:
    word1 word, word2 word, word1 ......word1000
    Нужно было взять до n - запятой. Разделитель пробел с запятой.
    Посмотрел была тема за 2013 год и закрыта, но так и не решили, что делать с последней запятой:
    https://www.nulled.cc/threads/239620/

    Код:
    ^(.+?(?=,|$)){1,20}
    - от 1 вхождения до 20 с учетом конца строки т.к в конце нету запятой.
    Посмотрите пожалуйста, не накосячил ли я тут?
     
  2. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    194
    Симпатии:
    235
    Вроде всё норм.
    Условие "от 1 вхождения до 20" можно представить так
    Код:
    ^((?:.+?,){0,19}[^,]+)
    
     
    Последнее редактирование: 18 май 2015
    javx, latteo и RedRabbit нравится это.
  3. BestProxies

    BestProxies Создатель

    Регистр.:
    15 авг 2012
    Сообщения:
    14
    Симпатии:
    3
    Такой вариант может быть быстрее регулярки

    Код:
    // Взять подстроку до n-й запятой
    
    $n = 3;
    $string = 'word1, word2, word3, word4, word5';
    
    $parts = explode(', ',  $string, $n + 1);
    array_pop($parts);
    $string = implode($parts, ', ');
    
    var_dump($string);
    
     
  4. mSnus

    mSnus Создатель

    Регистр.:
    4 дек 2015
    Сообщения:
    24
    Симпатии:
    5
    а что будет, если в $string нет запятых? пустая строка на выходе...

    я бы какой-то такой код наворотил, без регэкспов:
    PHP:
    <?php

    $test 
    'this long sentence, is really, the, test';
    $pat ', ';
    $n 2;
    $k 0;

    while ((
    $res strpos($test$pat$k)) && ($n 0)) {
        
    $k $res strlen($pat);
        
    $n--;
        echo(
    $k."<br>");
    }

    if (
    $k == 0) {
        echo (
    'Pattern not found.');
    } else {
        echo (
    "$k:".substr($test$k));
    }

    ?>
     
Статус темы:
Закрыта.