<?php
function get_between($startString, $endString, $myFile){
//Escape start and end strings.
$startStringSafe = preg_quote($startString, '/');
$endStringSafe = preg_quote($endString, '/');
//non-greedy match any character between start and end strings.
//s modifier should make it also match newlines.
preg_match_all("/$startStringSafe(.*?)$endStringSafe/s", $myFile, $matches);
return $matches;
}
$myFile = 'fkdhkvdf(mat(((ch1)vdsf b(match2) dhdughfdgs (match3)';
$list = get_between("(", ")", $myFile);
foreach($list[1] as $list){
echo $list."\n";
}
我这样做了,它似乎有效。(显然,您需要用您的 file_get_contents 语句替换我的 $myFile 分配行。)一些事情:
A:单引号不会发生变量替换。因此,您的 preg_replace_all 正则表达式将无法正常工作。因为它实际上将 $startString 添加到您的表达式而不是 (. (我还在匹配字符串的末尾删除了对 } 的检查。如果您需要它,请将其重新添加\\}
到结束分隔符之前。)
B: $list 将是一个数组数组。我相信默认情况下,索引零将包含所有完全匹配。index one 将包含第一个子模式匹配。
C: 这只有在你试图匹配的子模式中永远找不到 $endString 时才有效。比如说,如果你期望 (matc(fF)) 给你 matc(fF),它不会。它会给你 match(fF. 如果你想在这种情况下得到前一个结果,你需要一个更强大的解析器。
编辑:这里的 get_between 函数也应该与 (
and一起使用)}
,或者你想要的任何其他东西。