Функция explode (), которая игнорирует символы внутри кавычек? - PullRequest
8 голосов
/ 16 июля 2010

Кто-нибудь знает быструю и простую explode() подобную функцию, которая может игнорировать символы разделителя, заключенные в пару произвольных символов (например, в кавычки)?

Пример:

my_explode(
  "/", 
  "This is/a string/that should be/exploded.//But 'not/here',/and 'not/here'"
);

должен привести к массиву со следующими членами:

This is
a string 
that should be 
exploded.

But 'not/here', 
and 'not/here'

тот факт, что символы заключены в одинарные кавычки, избавит их от делителей.

Бонусные баллы за решение, которое можетиметь дело с двумя символами-обертками

(not/here)

Было бы предпочтительнее использовать нативное PHP-решение, но я не думаю, что такое существует!

Ответы [ 3 ]

7 голосов
/ 16 июля 2010

str_getcsv($str, '/')

На связанной странице есть рецепт для <5.3. </p>

4 голосов
/ 07 декабря 2012

Это почти невозможно с preg_split, потому что вы не можете определить по середине строки, находитесь ли вы в кавычках или нет. Тем не менее, preg_match_all может сделать эту работу.

Простое решение для одного типа цитаты:

function quoted_explode($subject, $delimiter = ',', $quote = '\'') {
    $regex = "(?:[^$delimiter$quote]|[$quote][^$quote]*[$quote])+";
    preg_match_all('/'.str_replace('/', '\\/', $regex).'/', $subject, $matches);
    return $matches[0];
}

Эта функция будет иметь все виды проблем, если вы передадите ей определенные специальные символы (\ ^ -], в соответствии с http://www.regular -expressions.info / reference.html ), поэтому вам понадобится чтобы избежать тех. Вот общее решение, которое экранирует специальные символы регулярных выражений и может отслеживать несколько видов кавычек отдельно:

function regex_escape($subject) {
    return str_replace(array('\\', '^', '-', ']'), array('\\\\', '\\^', '\\-', '\\]'), $subject);
}

function quoted_explode($subject, $delimiters = ',', $quotes = '\'') {
    $clauses[] = '[^'.regex_escape($delimiters.$quotes).']';
    foreach(str_split($quotes) as $quote) {
        $quote = regex_escape($quote);
        $clauses[] = "[$quote][^$quote]*[$quote]";
    }
    $regex = '(?:'.implode('|', $clauses).')+';
    preg_match_all('/'.str_replace('/', '\\/', $regex).'/', $subject, $matches);
    return $matches[0];
}

(Обратите внимание, что я держу все переменные в квадратных скобках, чтобы минимизировать то, что нужно экранировать - за пределами квадратных скобок специальных символов примерно вдвое больше.)

Если вы хотите использовать] в качестве цитаты, то вы, вероятно, хотели бы использовать [в качестве соответствующей цитаты, но я оставлю добавление этой функции в качестве упражнения для читателя. :)

0 голосов
/ 16 июля 2010

Что-то очень близкое к preg_split: http://fr2.php.net/manual/en/function.preg-split.php#92632

Он обрабатывает несколько символов-оболочек И несколько символов-разделителей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...