Проблема в том, что в вашей строке новые строки, где. в шаблоне совпадает только с одной строкой, вам нужно добавить модификатор / s, чтобы сделать. чтобы соответствовать многострочным
Вот мое решение, я предпочитаю это так.
<?php
$html=<<<EOD
<html>
<head>
</head>
<body buu="grger" ga="Gag">
<p>Some text</p>
</body>
</html>
EOD;
// get anything between <body> and </body> where <body can="have_as many" attributes="as required">
if (preg_match('/(?:<body[^>]*>)(.*)<\/body>/isU', $html, $matches)) {
$body = $matches[1];
}
// outputing all matches for debugging purposes
var_dump($matches);
?>
Редактировать: я обновляю свой ответ, чтобы дать вам более подробное объяснение, почему ваш код не работает.
У вас есть эта строка:
<html>
<head>
</head>
<body>
<p>Some text</p>
</body>
</html>
Кажется, все в порядке, но на самом деле у вас есть непечатные символы (символы новой строки) в каждой строке.
У вас есть 53 печатных символа и 7 непечатаемых (новые строки, \ n == 2 символа для каждой новой строки).
Когда вы достигнете этой части кода:
$index_of_body_end_tag = strpos($html, '</body>');
Вы получаете правильную позицию (начиная с позиции 51), но при этом учитываются новые строки.
Итак, когда вы достигнете этой строки кода:
$index_of_body_start_tag + strlen($matched_body_start_tag)
Это было оценено до 31 (включая новые строки), и:
$index_of_body_end_tag - $index_of_body_start_tag + strlen($matched_body_start_tag)
Он оценивается как 51 - 25 + 6 = 32 (символы, которые вы должны прочитать), но у вас есть только 16 печатных символов текста между и и 4 непечатаемых символа (новая строка после и новая строка до ). И вот проблема, вы должны сгруппировать вычисления (расставить приоритеты) следующим образом:
$index_of_body_end_tag - ($index_of_body_start_tag + strlen($matched_body_start_tag))
оценивается как 51 - (25 + 6) = 51 - 31 = 20 (16 + 4).
:) Надеюсь, это поможет вам понять, почему расстановка приоритетов важна. (Извините, что ввел вас в заблуждение насчет перевода строки, он действителен только в приведенном выше примере с регулярным выражением).