function get_inner_html( $source, $tag, $length = NULL )
{
$closing_tag = str_replace( '<', '</', $tag ); // HTML closing tags are opening tags with a preceding slash
$closing_tag_length = strlen( $closing_tag );
$tag_length = strlen( $tag ); // Will need this for offsets
$search_offset = 0; // Start at the start
$tag_internals = FALSE;
while ( strpos( $source, $tag, $search_offset ) ) // Keep searching for tags until we find no more
{
$tag_position = strpos( $source, $tag, $search_offset ); // Next occurrence position
$tag_end = strpos( $source, $closing_tag, $search_offset ); // Next closing occurrence
if ( $length == NULL )
{
$substring_length = $tag_end - ($tag_position + $tag_length);
} else
{
$substring_length = $length;
}
$substring = substr( $source, $tag_position + $tag_length, $substring_lenth );
$tag_internals[] = $substring;
$search_offset = $tag_end + $closing_tag_length; // The next iteration of loop will start at this position, effectively trimming off previous locations
}
return $tag_internals; // Returns an array of findings for this tag or false if tag not found
}
В вашем вопросе указана полная строка или подмножество на основе пройденной длины. Если вам нужны оба варианта, вам нужно удалить if
и сделать секунду substr
, чтобы вытащить всю строку. Вероятно, сохраняя это в другом массиве и возвращая массив из двух массивов, одного из полных строк и одного из обрезанных строк.
Я не запускал этот код, поэтому некоторые ошибки могут существовать (читай: существуют), и он работает только для самых основных тегов. Если у какого-либо из ваших тегов есть атрибуты, вам нужно их обрезать и настроить вычисления закрывающих тегов, чтобы избежать наличия длинных закрывающих тегов, которые не существуют.
Это простой пример, но имейте в виду, что многие строковые функции PHP довольно скромны и не подходят для обработки длинных строк (например, полных HTML-файлов) и построчно по сравнению с файлом, так как синтаксический анализ строк может работать лучше. Я поддерживаю всех, кто говорит, пишите или используйте существующий парсер, поскольку вы, вероятно, получите лучшие результаты.