【问题标题】:Regular Expression from csv like to php array declaration从 csv 到 php 数组声明的正则表达式
【发布时间】:2014-06-24 12:23:26
【问题描述】:

有没有办法使用正则表达式(或级联中的几个正则表达式)将类似 csv 的文本转换为类似于 php 数组声明的内容,具有任意数量的字段?

例如,正则表达式应该从这里开始:

field1 field2 field3 field4 ...
value1 value2 value3 value4 ...

到这里:

"field1" => "value1",
"field2" => "value2",
"field3" => "value3",
"field4" => "value4",
...

这可能只使用正则表达式吗?您对实际实施有什么建议吗?

【问题讨论】:

    标签: regex preg-replace pcre


    【解决方案1】:

    假设 Windows 样式的行结尾,您可以进行多次搜索并将搜索替换为 ^ *(\w+)(.*)\r\n *(\w+) 并替换为 !\1=\3\r\n\2\r\n。然后运行另一个简单的编辑以删除前导 ! 字符。使用问题中的示例

    field1 field2 field3 field4 ...
    value1 value2 value3 value4 ...
    

    第一次替换产生:

    !field1=value1
     field2 field3 field4 ...
     value2 value3 value4 ...
    

    下一个替换产生:

    !field1=value1
    !field2=value2
     field3 field4 ...
     value3 value4 ...
    

    在另外两次替换后,它完成离开:

    !field1=value1
    !field2=value2
    !field3=value3
    !field4=value4
     ...
     ...
    

    剩余的编辑需要整理!. 字符。

    搜索字符串允许在^ * 行的开头使用可选空格。 然后它查找字段名称(\w+) 和该行的其余部分(.*) 和行分隔符\r\n。 接下来,它会查找可选空格,然后查找带有 *(\w+) 的字段值。

    替换只是对找到的字段重新排序并添加前导!,以便后续的全部替换操作不会找到已匹配的字段。

    不确定如何将其映射到 PHP,但它在 Notepad++ 6.5.5 版中运行良好。

    【讨论】:

    • 我试试这个!请注意:点表示更多字段,而不仅仅是点
    • 思路不错,但是regexp就是不行……你在pcre环境下试过了吗?
    • @clami219 您是否为您的 PCRE 版本使用了“正确”的行尾? (注意PCRE有很多含义。)
    • PCRE 代表 Perl 兼容正则表达式。无论如何,你是对的,问题在于行尾!干得好!
    • @clami219 我的意思是有几个系统声称可以提供 PCRE,但它们都提供了略有不同的设施。很高兴我的回答对您有所帮助。
    【解决方案2】:

    纯正则表达式无法做到这一点。但是您可以在 PHP 中使用数组简单地做到这一点:

    $text = "field1 field2 field3 field4 ...
              value1 value2 value3 value4 ...";
    
    $arr = explode("\n", $text);
    
    $field = explode(' ', $arr[0]);
    $value = explode(' ', $arr[1]);
    

    然后你可以使用foreach循环来做到这一点

    【讨论】:

    • 这不是您在 PHP 中使用函数的方式。 $arr = explode("\n", $text);,但无论如何这对 OP 没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多