正则表达式认为半冒号与双引号相同

时间:2016-06-06 15:29:07

标签: php regex

我正面临着PHP中的正则表达式的一个大问题。我想提取以分号结尾的每个部分,因为在每一行的开头都有一个函数,但是当我尝试这个时:

$text = 'write("develop");read("d");convert("c");';
preg_match_all('#(?s)(.*?);#',$text,$matches);

$matches包含:

Array ( 
    [0] => write("
    [1] => develop"
    [2] => ); 
    [3] => read("
    [4] => d" 
    [5] => );  
    [6] => convert("
    [7] => c"
    [8] => ); 
)

我需要找到$matches给出的方式:

Array ( 
    [0] => write("develop"); 
    [1] => read("d"); 
    [2] => convert("c"); 
)

在编译代码时,PHP认为分号与双引号相同。

4 个答案:

答案 0 :(得分:0)

因此,根据您在评论中所需的结果,由于您在正则表达式中定义的分组,您收到的列太多了。

()内的任何内容都被视为捕获组,并将作为单独结果传递给您传递给函数的数组中。 More Reference

你的正则表达式实际上非常简单。

preg_match_all('/[^;]*;/',$text,$matches);


[^;]* match a single character not present in the list below
  Quantifier: * Between zero and unlimited times, as many times as possible,
    giving back as needed [greedy]
  ; the literal character ;
; matches the character ; literally

Explanation from regex101

答案 1 :(得分:0)

如果只使用preg_split()呢?它比explode()(见下文)更有开销,但可以告诉它将分隔符留在原位。

$text = 'write("develop");read("d");convert("c");';
$matches = preg_split("/(.*?;)/", $text, null, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

或者,由于您实际上不需要正则表达式,explode()可能会更好:

$text = 'write("develop");read("d");convert("c");';
$matches = explode(";", $text);
// need to tack the semicolon back on
array_walk($matches, function(&$m){if($m) $m .= ";";});

值得一提的是,当双引号内的文本本身包含分号时,这两个都会失败,例如: write("develop");read("d;c");

答案 2 :(得分:-1)

试试这个:

schema-tool

答案 3 :(得分:-1)

搜索之后,我发现问题在于我使用了htmlspecialchars($text);,因此php已将双引号转换为分号。