除非在引号中添加新行,否则在新行中拆分字符串

时间:2014-12-23 16:11:05

标签: php split

我可以在新行中拆分字符串,除非新行在引号内吗?

$string = 'aa\nbb\n"cc\ndd"';
$arr = explode("\n", $string);
//$arr = array('aa','bb','"cc','dd"');

我想:

$arr = array('aa','bb','cc\ndd');

2 个答案:

答案 0 :(得分:1)

基于您的(*SKIP)(*FAIL)通话,我将假设您在发布示例输入时犯了一个错误,并且您的实际输入会生成您提供的示例输出。

您可以使用$text = <<<TEXT aa\nbb\n"cc\ndd" TEXT; var_export(preg_split('~"[^"]*"(*SKIP)(*FAIL)|\n~', $text)); 来消耗和取消用双引号引起来的子字符串,从而拆分未用双引号引起来的换行符,然后在换行符上爆炸。

诚然,如果您的文本可能包含转义的双引号字符,这将是不可靠的-因为该模式会将转义的引号与未转义的引号视为相同。

代码:(Demo

array (
  0 => 'aa',
  1 => 'bb',
  2 => '"cc
dd"',
)

输出:

---
apiVersion: v1
kind: Service
metadata:
  name: admin-service
  namespace: default
  annotations:
    cloud.google.com/app-protocols: '{"https":"HTTPS"}'
spec:
  type: NodePort
  selector:
    app: iteam-admin
  ports:
  - port: 443
    targetPort: 8443
    name: https
    protocol: TCP

答案 1 :(得分:0)

在您的示例中,&#39; ... \ n ...&#39;不是新手,正如轴心所指出的那样。 PHP中的换行符更容易用双引号表示,因此PHP将它们解释为换行符。也许你的意思如下:

$string = "aa\nbb\n\"cc\ndd\"";

如果是这种情况,您可以像这样创建一个正则表达式样式的分割,它应该捕获所有不在引号之间的换行符:

$arr = preg_split("/(\n)(?=(?:[^\"]|\"[^\"]*\")*$)/m", $string);

请注意多行标记(m),因为您正在处理换行符。