我正面临着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认为分号与双引号相同。
答案 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
答案 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已将双引号转换为分号。