PHP Regex使用','除了','在quote和double qoute之外使用','爆炸字符串

时间:2017-07-05 09:37:53

标签: php regex

除了使用','而不是在引号和双引号内怎么做爆炸?

这是我要爆炸的字符串:

`ot_request_id` int(11) NOT NULL,`ot_hours` int(11) NOT NULL,`ot_timelog_id` int(11) NOT NULL,`ot_user_id` int(11) NOT NULL,`ot_filing_date` datetime NOT NULL,`ot_approveby_id` int(11) NOT NULL,`final_approved` int(11) NOT NULL DEFAULT '0' , `ot_token` varchar(100) DEFAULT 'Your, name, here' NOT NULL,`startTime` datetime NOT NULL,`endTime` datetime NOT NULL

我希望输出变为

`ot_request_id` int(11) NOT NULL `ot_request_id` int(11) NOT NULL,
`ot_hours` int(11) NOT NULL ,
`ot_timelog_id` int(11) NOT NULL,
`ot_user_id` int(11) NOT NULL,
`ot_filing_date` datetime NOT NULL,
`ot_approveby_id` int(11) NOT NULL,
`final_approved` int(11) NOT NULL DEFAULT '0' ,
`ot_token` varchar(100) DEFAULT 'Your, name, here' NOT NULL,
`startTime` datetime NOT NULL,
`endTime` datetime NOT NULL

这是我的代码:

$array = explode(",",$str);// change to Regex
foreach($array as $m){
    echo "<br>$m";
}

5 个答案:

答案 0 :(得分:1)

这是确定正确的模式匹配逻辑以实现所需结果的问题。

使用REGEX(explode()不使用REGEX - 它在字符串标记上拆分),我们只能定位那些由`进行的逗号。

$array = preg_split('/,(?= ?`)/', $str);

注意我们还允许在和。之间有一个可选空格。

答案 1 :(得分:0)

我认为你安全地假设&#34;,&#34;作为分隔符,没有太多麻烦:

s1=new DatagramSocket(1234)
s2=new DatagramSocket(1234)

bytes=xxxxxx
packet = DatagramPacket(bytes, bytes.size,InetSocketAddress("localhost",1234))
new DatagramSocket().send(packet)
//  and then the s1 and s2 can receive the packet.

注意我现在在echo中加了一个`。

答案 2 :(得分:0)

与你关于&#34;引用之间的问题有点不同&#34;:看起来像是逗号,它总是在一个背景之前(或者是一个白色空间跟着背景)

<?php
$s = "`ot_request_id` int(11) NOT NULL,`ot_hours` int(11) NOT NULL,`ot_timelog_id` int(11) NOT NULL,`ot_user_id` int(11) NOT NULL,`ot_filing_date` datetime NOT NULL,`ot_approveby_id` int(11) NOT NULL,`final_approved` int(11) NOT NULL DEFAULT '0' , `ot_token` varchar(100) DEFAULT 'Your, name, here' NOT NULL,`startTime` datetime NOT NULL,`endTime` datetime NOT NULL";

$b = preg_replace('#,\s*`#', '[BR]`', $s);

$answer = explode('[BR]', $b);
print_r($answer);
当空格不存在时(

会更容易

注意:preg_split()会避免插入[BR]的额外步骤,只会在下一行爆炸:更好地使用preg_split,因为已经回答了

答案 3 :(得分:0)

虽然已经回答并接受了(因为我已经工作了一段时间),但我会提交我的答案,因为它处理了一些接受的答案并没有。

使用

(?<=,)(?!\R)(?=(?:[^'"]*(['"])(?:\\.|(?!\1).)*\1)*[^'"]*$)

爆炸你的字符串应该这样做。它fi

匹配逗号后面的位置,不是后跟换行符(负面预测(?!\R)),并且

  1. 零个或多个字符的序列,不包含引号

    [^'"]*

  2. 捕获的引用字符

    (['"])

  3. 转义字符

    \\.

    或与所捕获的报价不匹配的字符,使用否定预测进行测试。

    (?!\1).

    1到3属于非捕获组,可以重复任意次数(包括零)。

  4. 最后它以零个或多个不包含引号的字符序列结束。 $(匹配行尾)以确保整个字符串匹配。

    [^'"]*$

  5. See it here at regex101

    请注意,此解决方案假设打开/关闭引号在字符串中是平衡的(除非 in 带引号的字符串)。

    在接受的答案中处理的事情是

    1. 单引号字符串内部双引号字符串,反之亦然。

      e.g。 "It's a solution"

    2. 字符串中的转义字符

      e.g。 'It\'s a solution'

    3. 这可能是完全没必要的,但当我开始摆弄这个时,我的心态就是这样,所以:)

答案 4 :(得分:0)

使用此正则表达式:

(?<=,)(?=(?:(?:[^`'"]*[`'"]){2})*[^`'"]*$)

它涵盖了&#39; &#34;和`as quote

Regex demo

示例来源(run here

$re = '/(?<=,)(?=(?:(?:[^`\'"]*[`\'"]){2})*[^`\'"]*$)/m';

$str = '`ot_request_id` int(11) NOT NULL `ot_request_id` int(11) NOT NULL,`ot_hours` int(11) NOT NULL,`ot_timelog_id` int(11) NOT NULL,`ot_user_id` int(11) NOT NULL,`ot_filing_date` datetime NOT NULL,`ot_approveby_id` int(11) NOT NULL,`final_approved` int(11) NOT NULL DEFAULT \'0\' ,
`ot_token` varchar(100) DEFAULT \'Your, name, here\' NOT NULL,`startTime` datetime NOT NULL,`endTime` datetime NOT NULL';


$keywords = preg_split($re,$str);
print_r($keywords);

将输出:

Array ( [0] => `ot_request_id` int(11) NOT NULL `ot_request_id` int(11) NOT NULL, [1] => `ot_hours` int(11) NOT NULL, [2] => `ot_timelog_id` int(11) NOT NULL, [3] => `ot_user_id` int(11) NOT NULL, [4] => `ot_filing_date` datetime NOT NULL, [5] => `ot_approveby_id` int(11) NOT NULL, [6] => `final_approved` int(11) NOT NULL DEFAULT '0' , [7] => `ot_token` varchar(100) DEFAULT 'Your, name, here' NOT NULL, [8] => `startTime` datetime NOT NULL, [9] => `endTime` datetime NOT NULL )