Может кто предложит более умный/красивый механизм:
есть вызов preg_split("/;/", 'start;"path;test";end'). Не принципиально - ПХП и preg_split, Пёрл и split это или ещё что.
Нужно разбить строку на start, "path;test" и end... В общем застрял. Нужно, чтобы ";" встречающийся в тексте, который заключён в кавычки был проигнорирован и не использовался в качестве разделителя. Вводить символ экранирования для ";" не слишком катит.
Т.е. нужно написать соответствующий регэксп.
Разбить строку, но пропустить разделители в кавычках (Средствами регэкспов)
Модератор: Модераторы разделов
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
-
Liksys
- Сообщения: 2910
Re: Разбить строку, но пропустить разделители в кавычках
поставь булево значение на пробег по строке, как только встречается первая кавычка, бул ставится в истину и делай так:
if ( (status == true) && (c == ';') )
continue;
гле статус - булева цифра, а с - текущий символ. Как только встречается вторая кавычка, status устанавливается в противоположное значение.
if ( (status == true) && (c == ';') )
continue;
гле статус - булева цифра, а с - текущий символ. Как только встречается вторая кавычка, status устанавливается в противоположное значение.
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
Re: Разбить строку, но пропустить разделители в кавычках
Ммм... Мне сложный регэксп нужен, который скажет "точка с запятой, но только не та, которая ключена в закавыченный текст"...
-
Nab
- Сообщения: 257
Re: Разбить строку, но пропустить разделители в кавычках
Единственное что я пока придумал, это для перла
split('(\"[^\"]*\")?;(\"[^\"]*\")?', 'start;"path;test";end'))
но этот вариант хоть и справляется с задачей, но при этом создает кучу пустых элементов....
надо еще подумать...
split('(\"[^\"]*\")?;(\"[^\"]*\")?', 'start;"path;test";end'))
но этот вариант хоть и справляется с задачей, но при этом создает кучу пустых элементов....
надо еще подумать...
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
Re: Разбить строку, но пропустить разделители в кавычках
М-да... Вот так:
не создаёт. Но тогда теряется та часть, что была в кавычках. Чую - "истина где-то рядом".
Код: Выделить всё
split('(?:\":[^\"]*\")*;(?:\"[^\"]*\")*', 'start;"path;test";end');не создаёт. Но тогда теряется та часть, что была в кавычках. Чую - "истина где-то рядом".
-
Nab
- Сообщения: 257
Re: Разбить строку, но пропустить разделители в кавычках
Мне кажется задача через split не решаема 
Ведь ему нужно указать выражение которое разделяет элементы....
А указать более точный регексп без захвата, и анализа соседних символов не реально, то есть они тоже попадут в это выражение....
Может и возможно состряпать хитрое выражение с обратными ссылками и т.д. , но необходимо досконально знать как работает split и как он внутри это все проворачивает...
По моему все же проще делать обработку первоначальную строки, или результата...
Ну или отказаться от split вообще...
Ведь ему нужно указать выражение которое разделяет элементы....
А указать более точный регексп без захвата, и анализа соседних символов не реально, то есть они тоже попадут в это выражение....
Может и возможно состряпать хитрое выражение с обратными ссылками и т.д. , но необходимо досконально знать как работает split и как он внутри это все проворачивает...
По моему все же проще делать обработку первоначальную строки, или результата...
Ну или отказаться от split вообще...
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
Re: Разбить строку, но пропустить разделители в кавычках
Решил пока снизить отложить проблему, а в последствии экранировать символом "|", т.к. там реально используется виндовый путь, в котором могла встретиться ";".
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Разбить строку, но пропустить разделители в кавычках
Вот код на perl, который решает эту задачу. Правда не через split.
Код: Выделить всё
$_ = 'start;"path;test";end';
while(/(^|;)("[^"]*"|[^;]*)/g) {
print "$2\n"
}-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu