【问题标题】:PHP Regex: Split by spaces that are not in quotesPHP Regex:由不在引号中的空格分隔
【发布时间】:2016-01-23 20:33:15
【问题描述】:

如何将 php 中的字符串用不包含在双引号内的空格分割?例如,这个:

"hello my \"name is bob\""

会变成这样:

["hello", "my", "\"name is bob\""]

【问题讨论】:

标签: php regex


【解决方案1】:

你可以使用这个pettern:/\s(?=([^"]*"[^"]*")*[^"]*$)/ 字符串可以任意长,引号可以转义或不转义。 这个:"hello my \"name is bob\" hello my \"name is john\" end" 或者这个'hello my "name is bob" hello my "name is john" end' 是可能的。

使用示例:

$array = preg_split('/\s(?=([^"]*"[^"]*")*[^"]*$)/', "hello my \"name is bob\" hello my \"name is john\" end");

【讨论】:

  • 这是此页面上唯一对我有用的解决方案。谢谢。
【解决方案2】:

您可以基于正则表达式使用此函数:

function splitNonQuoted($data) {
    preg_match_all('/\S*?(".*?"\S*?)*( |$)/', $data, $matches);
    array_pop($matches[0]);
    return $matches[0];
}

使用示例:

print_r (splitNonQuoted("hello my \"name is bob\""));

输出:

Array
(
    [0] => hello 
    [1] => my 
    [2] => "name is bob"
)

【讨论】:

    【解决方案3】:

    这是preg_split 的解决方案,仅适用于您的特定情况:

    $words = preg_split('/(?!\\"\w+?)\s+(?!\w+\s*?\w*\\"\Z)/', "hello my \"name is bob\"");
    var_dump($words);
    
    // output:
    array(3) {
      [0]=>
      string(5) "hello"
      [1]=>
      string(2) "my"
      [2]=>
      string(13) ""name is bob""
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      相关资源
      最近更新 更多