Найти несколько подстрок в строке с неизвестным окончанием - PullRequest
0 голосов
/ 04 февраля 2020

У нас есть содержимое страницы с несколькими экземплярами get_template_part. Мы хотим получить их в массиве, сделав на них eval, чтобы мы могли включить и эти части шаблона.

Проблема в том, что мы знаем начало "get_template_part" и окончание "');", но окончание то же самое для многих подобных случаев, которые мы не хотим захватывать.

Как получить только окончание get_template_part и исключить все остальные

Пример строки, которую мы хотим включить: <?php get_template_part( 'template-parts/breadcrumbs' ); ?>

Я попробовал следующую функцию который принимает стог сена и 2 иголки и возвращает соответствующую строку, но опять же вторая игла никоим образом не является исключительной для первой иглы

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;
}

Я использую эту функцию со следующими атрибутами:

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

1 Ответ

1 голос
/ 04 февраля 2020

Полные совпадения будут в $matches[0], а то, что находится между ' ', будет в $matches[1]. Вы можете переместить ( ), чтобы получить больше или меньше, и добавить <?php, если вам это нужно:

preg_match_all("/get_template_part\s*\(\s*'(.+?)'\s*\);?/", $template, $matches);
print_r($matches);
  • Совпадение get_template_part, затем \s* пробел 0 или более
  • Затем (, затем \s* пробел 0 или более
  • Затем ', затем (.+?) захват . символов +? 1 или более ленивых
  • Затем ' затем \s* пробел 0 или более, затем ), затем ; необязательно ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...