【问题标题】:split on several chars and include them in the parts拆分为几个字符并将它们包含在部分中
【发布时间】:2011-04-30 18:13:02
【问题描述】:

我想将字符串拆分为多个字符(+~>@,但我希望这些字符成为返回部分的一部分。

我试过了:

$parts = preg_split('/\+|>|~|@/', $input, PREG_SPLIT_DELIM_CAPTURE);

结果只有 2 个部分,应该有 5 个,而 split-char 不是第 [1] 部分的一部分。

我也试过了:

$parts = preg_split('/\+|>|~|@/', $input, PREG_SPLIT_OFFSET_CAPTURE);

结果是 1 部分太少(4 而不是 5),最后一部分包含拆分字符。

preg_split 中没有标志,结果几乎是完美的(尽可能多的部分),但所有拆分字符都消失了。

示例:

$input = 'oele>boele@4 + key:type:id + *~the end'; // spaces should be ignored
$output /* should be: */
        array( 'oele', '>boele', ' @4 ', '+ key:type:id ', '+ *', '~the end' );

是否有 spl 函数或标志来执行此操作,还是我必须自己制作一个 =(

【问题讨论】:

标签: php regex split


【解决方案1】:
$parts = preg_split('/(?=[+>~@])/', $input);

See it

由于您希望分隔符成为下一个分割部分的一部分,因此您的分割点就在分隔符之前,这可以通过正向预测轻松完成。

(?=     : Start of positive lookahead
 [+>~@] : character class to match any of your delimiters.
)       : End of look ahead assertion.

实际上,您是在要求 preg_split在分隔符之前的点拆分输入字符串。

【讨论】:

  • 我几乎满足于preg_split('/([\+>~@])/', $input, -1, PREG_SPLIT_DELIM_CAPTURE);。冷你解释你在做什么?=
  • @Rudie:我已经添加了一些解释。希望对您有所帮助。
  • 那么用正向看,现在分割点基本是空的?它不会在一个字符上分裂,而是在它之前?这很酷!那是标准的正则表达式还是 PHP 的东西?
  • @Rudie:你说得对。这是标准正则表达式,大多数正则表达式实现都支持它。更多信息在这里:regular-expressions.info/lookaround.html
  • (我最喜欢的网站!)但我在那里找不到?=?<=。谢谢!你能否解释一下这里发生了什么:/(?<=[abcd])(?![abcd])/u?仅当您感到无聊时=)我不能再投票了。
【解决方案2】:

您缺少对 limit 参数的赋值,这就是它返回的值低于您预期的原因,请尝试:

$parts = preg_split('/\+|>|~|@/', $input, -1, PREG_SPLIT_OFFSET_CAPTURE);

【讨论】:

  • 现在结果更奇怪了...所有匹配现在都是数组,其中 [0] 是捕获,[1] 是一个 int..? (不过很好!)
  • 来自 PHP 手册:[关于 OFFSET_CAPTURE] 请注意,这会更改数组中的返回值,其中每个元素都是由偏移量 0 处的匹配字符串及其字符串偏移量为偏移量 1 处的主题组成的数组.
  • 你读过 PHP 手册吗? =) 这很有趣!谢谢。它有帮助,但它不像 codaddict 的答案那么完美
【解决方案3】:

我过去也遇到过同样的问题。你必须用括号括住你的正则表达式,然后它有望工作

$parts = preg_split('/(\+|>|~|@)/', $input, PREG_SPLIT_OFFSET_CAPTURE);

这里是解释:http://www.php.net/manual/en/function.preg-split.php#94238

【讨论】:

  • 其实你没有。但是[\+>~@] 效果更好,因为它始终是 1 个字符。
【解决方案4】:

本是正确的。

只是为了补充他的答案,PREG_SPLIT_DELIM_CAPTURE 是一个值为 2 的常数,因此您得到 2 个拆分,同样PREG_SPLIT_OFFSET_CAPTURE 的值为 4。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多