Php 在结尾未知的字符串中查找多个子字符串

Php 在结尾未知的字符串中查找多个子字符串,php,string,Php,String,我们有一个页面的内容,其中包含多个get\u template\u part实例。我们希望在数组中获取它们,并在它们上执行eval,以便我们也可以包含这些模板部分 问题是我们知道开头的“get_template_part”和结尾的“;”,但是对于许多我们不想抓住的类似实例,结尾是相同的 我们如何只抓住get\u template\u part的结尾,而排除所有其他部分 我们希望包含的字符串示例: 我尝试了下面的函数,该函数接受一个草堆和两个指针,并返回匹配的字符串,但第二个指针绝不是第一个指针所

我们有一个页面的内容,其中包含多个
get\u template\u part
实例。我们希望在数组中获取它们,并在它们上执行
eval
,以便我们也可以包含这些模板部分

问题是我们知道开头的
“get_template_part”
和结尾的
“;”
,但是对于许多我们不想抓住的类似实例,结尾是相同的

我们如何只抓住
get\u template\u part
的结尾,而排除所有其他部分

我们希望包含的字符串示例:

我尝试了下面的函数,该函数接受一个草堆和两个指针,并返回匹配的字符串,但第二个指针绝不是第一个指针所独有的

function get_substring_part($haystack, $needle, $needle2, $find) {

$lastPos_one = 0;
$lastPos_two = 0;
$positions_one = array();
$positions_two = array();

while (($lastPos_one = strpos($haystack, $needle, $lastPos_one))!== false) {
    $positions_one[] = $lastPos_one;
    $lastPos_one = $lastPos_one + strlen($needle);
}
foreach ($positions_one as $value_start) {
    $return[]['start'] =  $value_start;
}

while (($lastPos_two = strpos($haystack, $needle2, $lastPos_two))!== false) {
    $positions_two[] = $lastPos_two;
    $lastPos_two = $lastPos_two + strlen($needle2);
}
foreach ($positions_two as $value_end) {
    $return[]['end'] =  $value_end;
}

$counter = 0;
foreach ($return as $positions) {
    $string['start'] = $positions['start'];
    $string['end'] = $positions['end'];
    $var = substr($haystack, $positions['start'], $positions['end']);


    if (strpos($var, $find) !== false) {
        $string['string'] = substr($haystack, $positions['start'], $positions['end']);
    }
    $counter++;
}

return $string;
}
Im使用此功能时具有以下属性:

get_substring_part($content, 'get_template_part', ');', 'get_template_part')

完全匹配将在
$matches[0]
中,介于
'
之间的内容将在
$matches[1]
中。您可以移动
()
以获得更多或更少的信息,并添加
。您有一些示例吗?到目前为止,您尝试了什么?请添加一个示例字符串,其中包含您尝试获取的内容和要排除的内容。您可以立即显示
get\u template\u part
的所有实例并显示所需的结果吗?效果非常好。让我再调试一下,我会把它标记为正确的。我们希望你不会有像
get\u template\u part(generate\u part())
,或者
get\u template\u part('look/someone/put/括号())
这样的事情,除了这些:
@Cid:实际上括号不会引起问题。也许是因为缺少引号
,但他们在问题中展示了引号。PHP解析器可能更适合这种需要,而不是正则表达式
preg_match_all("/get_template_part\s*\(\s*'(.+?)'\s*\);?/", $template, $matches);
print_r($matches);