除了空格在引号内之外,我怎样才能将每个空间分开?

时间:2015-06-14 00:12:05

标签: php regex

我知道如何将空格分成数组:

$array =  array_filter(preg_split('/\s+/',$a));

但如果字符串$a有引号,我希望正则表达式忽略其中的所有空格。

例如:

字符串:

  

@ IN TXT" V = SPF1 A MX IP4:x.x.x.x~ALL"

将拆分为数组部分:

  • @
  • TXT
  • " V = SPF1 A MX IP4:x.x.x.x~ALL" (不要介意包含'"''或不是)

2 个答案:

答案 0 :(得分:1)

使preg_split

您可以利用用于丢弃模式的PCRE动词SKIPFAIL。想法是丢弃引号内的内容,因此你可以使用这样的正则表达式:

".*?"(*SKIP)(*FAIL)|\s+

<强> Working demo

enter image description here

但是,如果您想使用"',可以使用此正则表达式:

(["']).*?\1(*SKIP)(*FAIL)|\s+

$keywords = preg_split("/([\"']).*?\1(*SKIP)(*FAIL)|\s+/", $a);

preg_match_all

另一方面,你也可以使用另一个正则表达式来捕捉你想要的东西:

(".*"|'.*?'|\S+)

<强> Working demo

$re = "/(\".*\"|'.*?'|\\S+)/"; 
$str = "@ IN TXT \"V=SPF1 A MX IP4:x.x.x.x ~ALL\" 'asdf asdf'"; 

preg_match_all($re, $str, $matches);

答案 1 :(得分:0)

您可以尝试php artisan queue:restart,这应该与您要查找的内容相匹配。

https://regex101.com/r/aZ7nJ8/2

一种相当粗暴的方式,但它的技巧和它包含引号,如果你不想要它们,你总是可以使用前瞻和后视。