【问题标题】:An explode() function that ignores characters inside quotes?一个忽略引号内字符的explode()函数?
【发布时间】:2011-03-16 22:32:40
【问题描述】:

有人知道类似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 解决方案是首选,但我认为不存在这样的事情!

【问题讨论】:

标签: php string


【解决方案1】:

这对于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];
}

(请注意,我将所有变量保留在方括号之间,以尽量减少需要转义的内容 - 在方括号之外,特殊字符的数量大约是两倍。)

如果您想使用 ] 作为引用,那么您可能想使用 [ 作为相应的引用,但我会将添加该功能作为练习留给读者。 :)

【讨论】:

  • 极端情况:如果引号不平衡,此函数将丢弃足够多的引号以使其平衡。
  • 我刚刚发现了 preg_quote 函数 - 这可能是在正则表达式中转义字符的更好方法。
【解决方案2】:

与 preg_split 非常接近的东西:http://fr2.php.net/manual/en/function.preg-split.php#92632

它处理多个包装字符和多个分隔符。

【讨论】:

  • 干杯@greg0ire,这看起来不错,但仍需要一些工作。我会尝试用我对正则表达式的薄弱知识将其更改为我的需要。
【解决方案3】:

str_getcsv($str, '/')

链接页面上有

【讨论】:

  • 然后将不同的字符作为附件传递。
  • 没关系。它返回Array ( [0] => This is [1] => a string [2] => that should be [3] => exploded. [4] => [5] => But 'not [6] => here', [7] => and 'not [8] => here' )
  • 对我来说闻起来像一个 PHP 错误。
  • str_getcsv 仅确认出现在拆分部分开头的包围字符(即在字符串的开头或分隔符之后)。不是错误(它可以正确处理 CSV),但对这个问题没有好处。
  • str_getcsv($str,'/',"'");第三个参数是外壳。
猜你喜欢
  • 1970-01-01
  • 2012-11-19
  • 2013-11-28
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
相关资源
最近更新 更多