首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >按分隔符拆分字符串,但如果对其进行转义则不会

按分隔符拆分字符串,但如果对其进行转义则不会
EN

Stack Overflow用户
提问于 2011-06-05 23:16:14
回答 3查看 5.5K关注 0票数 52

如何通过分隔符拆分字符串,但如果字符串被转义则不能?例如,我有一个字符串:

代码语言:javascript
复制
1|2\|2|3\\|4\\\|4

分隔符是|,转义的分隔符是\|。此外,我想忽略转义的反斜杠,因此在\\|中,|仍然是分隔符。

因此,使用上面的字符串,结果应该是:

代码语言:javascript
复制
[0] => 1
[1] => 2\|2
[2] => 3\\
[3] => 4\\\|4
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-05 23:20:46

使用黑魔法:

代码语言:javascript
复制
$array = preg_split('~\\\\.(*SKIP)(*FAIL)|\|~s', $string);

\\\\.匹配后跟字符的反斜杠,(*SKIP)(*FAIL)跳过它,\|匹配您的分隔符。

票数 107
EN

Stack Overflow用户

发布于 2011-06-06 13:52:09

最近,我想出了一个解决方案:

代码语言:javascript
复制
$array = preg_split('~ ((?<!\\\\)|(?<=[^\\\\](\\\\\\\\)+)) \| ~x', $string);

但黑魔法解决方案的速度仍然快了三倍。

票数 4
EN

Stack Overflow用户

发布于 2015-01-03 03:27:17

正则表达式的运行速度非常慢。一种更好的方法是在拆分之前从字符串中删除转义字符,然后将它们放回其中:

代码语言:javascript
复制
$foo = 'a,b|,c,d||,e';

function splitEscaped($str, $delimiter,$escapeChar = '\\') {
    //Just some temporary strings to use as markers that will not appear in the original string
    $double = "\0\0\0_doub";
    $escaped = "\0\0\0_esc";
    $str = str_replace($escapeChar . $escapeChar, $double, $str);
    $str = str_replace($escapeChar . $delimiter, $escaped, $str);

    $split = explode($delimiter, $str);
    foreach ($split as &$val) $val = str_replace([$double, $escaped], [$escapeChar, $delimiter], $val);
    return $split;
}

print_r(splitEscaped($foo, ',', '|'));

它在“,”上拆分,但如果用"|“转义就不会。它还支持双重转义,因此在拆分发生后,"||“变成了单个"|”:

代码语言:javascript
复制
Array ( [0] => a [1] => b,c [2] => d| [3] => e ) 
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6243778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档