ФорумПрограммированиеPHP для идиотов → preg_split пробелов, которые не в кавычках

preg_split пробелов, которые не в кавычках

  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 20 апреля 2009 г. 12:51

    есть такая строка
    test "hello world" blah 'fuck off'
    какая нужна регулярка, чтобы в результате обработки получилось так (array):
    test
    hello world
    blah
    fuck off

    то есть строка эксплодится по пробелам, которые не в кавычках
    мой вариант (очень уевый):
    заменять пробелы в кавычках какими нибудь символами типа "[email protected]#$%", потом просто эксплодить по пробелу и заменять в результате эти символы обратно на пробелы

    нет
  • AlexB

    Сообщения: 4297 Репутация: N Группа: в ухо

    Spritz 20 апреля 2009 г. 13:07, спустя 16 минут 18 секунд

    Я думаю все же preg_match_all
  • phpdude

    Сообщения: 26645 Репутация: N Группа: в ухо

    Spritz 20 апреля 2009 г. 16:25, спустя 3 часа 17 минут 36 секунд

    первоначальная замена + ксплод и последующая обратная замена.
    Сапожник без сапог
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 21 апреля 2009 г. 4:28, спустя 12 часов 3 минуты 29 секунд

    тоесть это не уевый вариант а самое то?)
  • phpdude

    Сообщения: 26645 Репутация: N Группа: в ухо

    Spritz 21 апреля 2009 г. 4:31, спустя 2 минуты 22 секунды

    aivee, хуевый вариант - думать
    Сапожник без сапог
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 21 апреля 2009 г. 4:36, спустя 4 минуты 58 секунд

    ну в принципе да, тут nенадо думать. а если в исходном тексте есть уже [email protected]#$%
    и заменять потом [email protected]#$% нужно будет в цикле

    $command = preg_replace('#"(.+?) (.+?)"#i', '\\[email protected]#$%\\2', mb_strtolower($command, 'utf-8'));
    $parts = explode(' ', $command);
    $result = array();

    foreach ($parts as $word)
    {
    $result[] = str_replace('[email protected]#$%', ' ', $word);
    }
  • phpdude

    Сообщения: 26645 Репутация: N Группа: в ухо

    Spritz 21 апреля 2009 г. 4:53, спустя 17 минут 32 секунды

    aivee, чувак, ты гонишь ….
    Сапожник без сапог
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 21 апреля 2009 г. 4:58, спустя 4 минуты 44 секунды

    в смысле? o_O
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 21 апреля 2009 г. 5:12, спустя 14 минут 1 секунду

    Обрезать всё нахуй по кавычкам.
    Нечётные элементы, это то что вне кавычек - порубить по пробелам.
    Чётные - то что в кавычках - оставить как есть.
    :)
  • AlexB

    Сообщения: 4297 Репутация: N Группа: в ухо

    Spritz 21 апреля 2009 г. 5:13, спустя 1 минуту

    Задолбали, толком не тестировал, но думаю принцип понятен


    $str = trim($str).' ';
    preg_match_all ('#(".+"\s)|(\'.+\'\s)|(.*\s)#U', $str, $words);
    print_r($words[0]);
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 21 апреля 2009 г. 11:52, спустя 6 часов 39 минут 6 секунд

    убейтеменя
    <?php
    $str = "foo test \"hello world\" fdsaf blah ' fuck off ' foo ";

    define('STATE_SPACE', 0);
    define('STATE_WORD', 1);
    define('STATE_QUOTE', 2);

    $len = strlen($str);
    $res = array();
    $state = STATE_SPACE;

    for ($i = 0, $j = -1; $i < $len; ++$i) {
    $ch = $str[$i];
    switch ($state) {
    case STATE_SPACE:
    if ($ch == '"' || $ch == "'") {
    $res[++$j] = '';
    $state = STATE_QUOTE;
    } else if (ctype_alnum($ch)) {
    $res[++$j] = $ch;
    $state = STATE_WORD;
    }
    break;
    case STATE_QUOTE:
    if ($ch != '"' && $ch != "'") {
    $res[$j] .= $ch;
    } else {
    $state = STATE_SPACE;
    }
    break;
    case STATE_WORD:
    if ($ch == '"' || $ch == '"') {
    $state = STATE_QUOTE;
    } else if ($ch == ' ' || $ch == '\n' || $ch == '\t') {
    $state = STATE_SPACE;
    } else {
    $res[$j] .= $ch;
    }
    break;
    }
    }

    var_dump($res);


    кавычек (' от ") не различает
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 21 апреля 2009 г. 12:22, спустя 30 минут 17 секунд

    omg
  • adw0rd

    Сообщения: 22920 Репутация: N Группа: в ухо

    Spritz 21 апреля 2009 г. 12:31, спустя 8 минут 55 секунд

    Timur, давай адрес )
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • phpdude

    Сообщения: 26645 Репутация: N Группа: в ухо

    Spritz 21 апреля 2009 г. 13:05, спустя 34 минуты 6 секунд

    Timur, ебануццо
    Сапожник без сапог
  • ubica

    Сообщения: 530 Репутация: N Группа: Кто попало

    Spritz 21 апреля 2009 г. 13:16, спустя 10 минут 49 секунд

    Timur, неплохой автомат)

Пожалуйста, авторизуйтесь, чтобы написать комментарий!