除了使用','而不是在引号和双引号内怎么做爆炸?
这是我要爆炸的字符串:
`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";
}
答案 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).
1到3属于非捕获组,可以重复任意次数(包括零)。
最后它以零个或多个不包含引号的字符序列结束。 $
(匹配行尾)以确保整个字符串匹配。
[^'"]*$
请注意,此解决方案假设打开/关闭引号在字符串中是平衡的(除非 in 带引号的字符串)。
在接受的答案中处理的事情是
单引号字符串内部双引号字符串,反之亦然。
e.g。 "It's a solution"
字符串中的转义字符
e.g。 'It\'s a solution'
这可能是完全没必要的,但当我开始摆弄这个时,我的心态就是这样,所以:)
答案 4 :(得分:0)
使用此正则表达式:
(?<=,)(?=(?:(?:[^`'"]*[`'"]){2})*[^`'"]*$)
它涵盖了&#39; &#34;和`as quote
示例来源(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 )