php удалить только тег <h1> с переносом и без гиперссылки - PullRequest
0 голосов
/ 01 августа 2011
$test = array('<h1>text1</h1>','<h1><a href="#">text2</a><h1>','<h1>text3</h1><p>subtext3</p>');

В длинных длинных текстах я использую preg_split, разрезаю их на мелкие кусочки.Я хочу удалить только тег h1 с переносом и без гиперссылки.

Я надеюсь удалить весь текст следующим образом: <h1>text1</h1> // только h1 с переносом и без гиперссылки.

И остаться <h1><a href="#">text2</a><h1><h1>text3</h1><p>subtext3</p>

1 Ответ

1 голос
/ 01 августа 2011

Используйте цикл, чтобы пройти через каждый элемент массива и найти каждый экземпляр строки "<". Тогда посмотрите на следующие 3 символа. Если они "h1>", то у вас есть правильный тег. Если вы когда-нибудь найдете «<» с другими 3 символами, это не «» тег HTML, и вы можете удалить этот объект массива. </p>

Чтобы удалить данный объект из массива, вы можете использовать unset ($ array [$ index]), и когда вы закончите, я рекомендую использовать сортировку, чтобы удалить любые пропуски индекса, которые могут произойти.

Вы захотите использовать такие функции, как strpos, чтобы получить позицию строки, и substr, чтобы получить подмножество данной строки. php.net твой друг:)

Вот пример функции, которая работает с вашим массивом $ test:

<?php
$test = array('<h1>text1</h1>','<h1><a href="#">text2</a><h1>','<h1>text3</h1><p>subtext3</p>');
function removeBadElements(&$array) {
    foreach($array as $k => $v) {
        // $v is a single array element
        $offset = 0;
        do {
            $pos = strpos($v, '<', $offset);
            $offset = $pos + 1;
            if($pos === false) { break; }

            $tag = substr($v, $pos, 3);
            $next = substr($v, $pos+1, 1);
            if($next == '/') { continue; }
            if($tag == '<h1') { continue; }
            else {
                unset($array[$k]);
                break;
            }
        } while($offset + 2 < strlen($v));
    }
}
echo "\nORIG ARRAY:\n";
print_r($test);
removeBadElements($test);
echo "\n\n-------\nMODIFIED ARRAY:\n\n";
print_r($test);
?>
...