php只删除<h1>标签包装而没有超链接</h1>

时间:2011-08-01 00:55:47

标签: php preg-replace preg-match-all

$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 个答案:

答案 0 :(得分:1)

使用循环遍历每个数组元素并查找字符串“&lt;”的每个实例。然后看看接下来的3个字符。如果他们是“h1&gt;”那么你有正确的标签。如果你找到“&lt;”具有不同的3个字符,然后它不是“”HTML标记,您可以删除此数组对象。

要从数组中删除给定对象,可以使用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);
?>