Функция, возвращающая подстроку и усеченную строку - PullRequest
1 голос
/ 16 ноября 2011

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

$tag='<body>';
//case1
$source=substr($source,strpos($source,$tag)+strlen($tag));
$sub=substr($source,0,strpos($source,'<'));
//case2
$source=substr($source,strpos($source,$tag)+strlen($tag));
$sub=substr($source,0,3);

Функция будетпринимает 3 параметра: исходный код, указанный тег и длину подстроки (для случая 2) и возвращает 2 переменные: обрезанный источник и подстрока.В общем, я хочу иметь такую ​​функцию:

function p($source,$tag,$len) {
  $source=substr($source,strpos($source,$tag)+strlen($tag));
  if(isset($len)) $sub=substr($source,0,$len);
  else $sub=substr($source,0,strpos($source,'<'));
  $ret=array();
  $ret[0]=$source;
  $ret[1]=$sub;
  return $ret;
}
//
$source=p($source,'<strong>')[0];
$sub1=p($source,'<strong>')[1];
$source=p($source,'<p>',100)[0];
$sub2=p($source,'<p>',100)[1];

1 Ответ

0 голосов
/ 17 ноября 2011
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-файлов) и построчно по сравнению с файлом, так как синтаксический анализ строк может работать лучше. Я поддерживаю всех, кто говорит, пишите или используйте существующий парсер, поскольку вы, вероятно, получите лучшие результаты.

...