【问题标题】:split a string by multiple delimeters, and one of them is +用多个分隔符分割一个字符串,其中一个是 +
【发布时间】:2016-04-10 14:18:15
【问题描述】:

编辑:我太从字面上理解了 - 一位评论者正确地指出查询字符串中的 + 只是一个空格的 url 编码 - 很抱歉造成混淆

我需要用几个分隔符 (, 和 +) 来分割一个字符串。背景是我将查询字符串参数保存到 $query 中(例如:$query = $_GET["geo"];),我想根据 , 和 + 将它们分成不同的部分(而不是空格,因为城镇并且状态可以有多个单词):

?geo=剑桥+马萨诸塞州或

?geo=马萨诸塞州剑桥

阅读here我正在尝试这样:

$query_array = preg_split("/[+,]+/", $query, -1, PREG_SPLIT_NO_EMPTY);

它为 分裂,但不是为 +

我需要逃避它吗?还是我应该以一种根本不同的方式来做这件事?

提前感谢您的帮助!

【问题讨论】:

  • /[\+,]+/ 是的,逃脱它。就像这样通过添加前面的`\`
  • @Martin 反斜杠也需要转义吧?那么/[\\+,]+/?
  • @Chris 没有。通过 regex101.com 运行代码会得到正确的结果,而不会转义反斜杠。 OP 正在搜索 + 而不是 \+
  • norepro => 显示你的相关真实代码
  • 请发布输入和所需输出的清晰示例。

标签: php preg-split


【解决方案1】:

您的输入没有+,您的输入中有一个空格。URL 解码您的geo 参数会得到Cambridge Massachusetts,因此在空格和, 上拆分,而不是+,

【讨论】:

  • 呃,你是对的-我错过了....查询字符串中的 + 表示空格所在的位置-(因此 URL 解码产生了一个空格)-我太从字面上理解了: (
【解决方案2】:

如果您不在 PCRE [...] 的方括号内转义特殊字符,PHP/PCRE 通常会很高兴,如果您确定遇到问题,则可能取决于您的确切 PHP 版本它如何处理 PCRE 特殊字符.

但是,我发现在 + 之前添加反斜杠意味着它始终被视为文字值而不是任何类型的特殊字符。

$query_array = preg_split("/[\+,]+/", $query, -1, PREG_SPLIT_NO_EMPTY);

Regex101 for this.

但是,您的原始代码 according to regex101.com 可以正常工作,因此您可能遇到的问题是您没有搜索字符串的全局长度,因此通过在正则表达式本身中附加 /g(不是PHP 函数正则表达式)来模拟多组捕获行为。

PHP 可能无法识别您的计数器值,您应该将您的 -1 替换为 NULL 以避免任何可能的混淆。

$query_array = preg_split("/[+,]+/", $query, NULL, PREG_SPLIT_NO_EMPTY);

应该非常适合您。

$query = "che,ese+tree,s+rh,tht+";
$query_array = preg_split("/[+,]+/", $query, NULL, PREG_SPLIT_NO_EMPTY);
print_r($query_array);

输出:

$query_array =>
    [0] = "che"
    [1] = "ese"
    [2] = "tree"
    [3] = "s"
    [4] = "rh"
    [5] = "tht"

【讨论】:

  • 谢谢!这是我第一次使用正则表达式,你的帖子很有帮助。虽然情节变厚了——正如新评论提到的那样,+ 实际上只是一个 url 编码的空间(我一直把它看得太字面了,没有意识到),所以我需要一起以不同的方式处理这个
【解决方案3】:

如果您知道地理参数可能带有“+”或“,”分隔符,请不要使用正则表达式,请使用:

 explode(',', str_replace('+', ',', $geo))

【讨论】:

    猜你喜欢
    • 2021-02-25
    • 2020-04-23
    • 1970-01-01
    • 2023-03-25
    • 2012-05-12
    • 2021-09-25
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多