Rumah php教程 php手册 php截取html字符串自动补全html标签

php截取html字符串自动补全html标签

May 25, 2016 pm 04:39 PM

文章来总结一下关于利用php截取html字符串自动补全html标签,实际开发中会经常碰到,很多人直接先strip_tags过滤掉html标签,但是就只剩下纯文本了,可读性非常差,下面是一个函数,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

<?php

/**

 * 截取HTML,并自动补全闭合

 * @param $html

 * @param $length

 * @param $end

 */

function subHtml($html, $length) {

    $result = &#39;&#39;;

    $tagStack = array();

    $len = 0;

    $contents = preg_split("~(<[^>]+?>)~si", $html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

    foreach ($contents as $tag) {

        if (trim($tag) == "") & nbsp;

        continue;

        if (preg_match("~<([a-z0-9]+)[^/>]*?/>~si", $tag)) {

            $result.= $tag;

        } else if (preg_match("~</([a-z0-9]+)[^/>]*?>~si", $tag, $match)) {

            if ($tagStack[count($tagStack) - 1] == $match[1]) {

                array_pop($tagStack);

                $result.= $tag;

            }

        } else if (preg_match("~<([a-z0-9]+)[^/>]*?>~si", $tag, $match)) {

            array_push($tagStack, $match[1]);

            $result.= $tag;

        } else if (preg_match("~<!--.*?-->~si", $tag)) {

            $result.= $tag;

        } else {

            if ($len + mstrlen($tag) < $length) {

                $result.= $tag;

                $len+= mstrlen($tag);

            } else {

                $str = msubstr($tag, 0, $length - $len + 1);

                $result.= $str;

                break;

            }

        }

    }

    while (!emptyempty($tagStack)) {

        $result.= &#39;</&#39; . array_pop($tagStack) . &#39;>&#39;;

    }

    return 

    $result;

}

/**

 * 截取中文字符串

 * @param $string 字符串

 * @param $start 起始位

 * @param $length 长度

 * @param $charset  编码

 * @param $dot 附加字串

 */

function msubstr($string, $start, $length, $dot = &#39;&#39;, $charset = &#39;UTF-8&#39;) {

    $string = str_replace(array(

        &#39;&&#39;,

        &#39;"&#39;,

        &#39;<&#39;,

        &#39;>&#39;,

        &#39; &#39;

    ) , array(

        &#39;&&#39;,

        &#39;"&#39;,

        &#39;<&#39;,

        &#39;>&#39;,

        &#39; &#39;

    ) , $string);

    if (strlen($string) <= $length) {

        return $string;

    }

    if (strtolower($charset) == &#39;utf-8&#39;) {

        $n = $tn = $noc = 0;

        while ($n < strlen($string)) {

            $t = ord($string[$n]);

            if ($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {

                $tn = 1;

                $n++;

            } elseif (194 <= $t && $t <= 223) {

                $tn = 2;

                $n+= 2;

            } elseif (224 <= $t && $t <= 239) {

                $tn = 3;

                $n+= 3;

            } elseif (240 <= $t && $t <= 247) {

                $tn = 4;

                $n+= 4;

            } elseif (248 <= $t && $t <= 251) {

                $tn = 5;

                $n+= 5;

            } elseif ($t == 252 || $t == 253) {

                $tn = 6;

                $n+= 6;

            } else {

                $n++;

            }

            $noc++;

            if ($noc >= $length) {

                break;

            }

        }

        if ($noc > $length) {

            $n-= $tn;

        }

        $strcut = substr($string, 0, $n);

    } else {

        for ($i = 0; $i < $length; $i++) {

            $strcut.= ord($string[$i]) > 127 ? $string[$i] . $string[++$i] : $string[$i];

        }

    }

    return $strcut . $dot;

}

/**

 * 取得字符串的长度,包括中英文。

 */

function mstrlen($str, $charset = &#39;UTF-8&#39;) {

    if (function_exists(&#39;mb_substr&#39;)) {

        $length = mb_strlen($str, $charset);

    } elseif (function_exists(&#39;iconv_substr&#39;)) {

        $length = iconv_strlen($str, $charset);

    } else {

        preg_match_all("/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/", $text, $ar); & nbsp;

        $length = count($ar[0]);

    }

    return $length;

}

?>

Salin selepas log masuk

实例,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

<?php

/*

* @param 要截取的HTML $str

* @param 截取的数量 $num

* @param 是否需要加上更多 $more

* @return 截取串

*/

$leng = strlen($str);

    if ($num >= $leng) return $str;

    $word = 0;

    $i = 0;

    /** 字符串指针 **/

    $stag = array(

        array()

    );

    /** 存放开始HTML的标志 **/

    $etag = array(

        array()

    );

    /** 存放结束HTML的标志 **/

    $sp = 0;

    $ep = 0;

    while ($word != $num) {

        if (ord($str[$i]) > 128) {

            //$re.=substr($str,$i,3);

            $i+= 3;

            $word++;

        } else if ($str[$i] == &#39;<&#39;) {

            if ($str[$i + 1] == &#39;!&#39;) {

                $i++;

                continue;

            }

            if ($str[$i + 1] == &#39;/&#39;) {

                $ptag = & $etag;

                $k = & $ep;

                $i+= 2;

            } else {

                $ptag = & $stag;

                $i+= 1;

                $k = & $sp;

            }

            for (; $i < $leng; $i++) {

                if ($str[$i] == &#39; &#39;) {

                    $ptag[$k] = implode(&#39;&#39;, $ptag[$k]);

                    $k++;

                    break;

                }

                if ($str[$i] != &#39;>&#39;) {

                    $ptag[$k][] = $str[$i];

                    continue;

                } else {

                    $ptag[$k] = implode(&#39;&#39;, $ptag[$k]);

                    $k++;

                    break;

                }

            }

            $i++;

            continue;

        } else {

            //$re.=substr($str,$i,1);

            $word++;

            $i++;

        }

    }

    foreach ($etag as $val) {

        $key1 = array_search($val, $stag);

        if ($key1 !== false) unset($stag[$key]);

    }

    foreach ($stag as $key => $val) {

        if (in_array($val, array(

            &#39;br&#39;,

            &#39;img&#39;

        ))) unset($stag[$key1]);

    }

    array_reverse($stag);

    $ends = &#39;</&#39; . implode(&#39;></&#39;, $stag) . &#39;>&#39;;

    $re = substr($str, 0, $i) . $ends;

    if ($more) $re.= &#39;...&#39;;

    return $re;

}

?>

Salin selepas log masuk

PHP截取字符串,生成文章摘要,我们在写BLOG时经常需要显示文章前一部分,但是又怕不恰当截断破坏封闭标签以造成整个文档结构破坏,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

<?php

function text_zhaiyao($text, $length) { //文章摘要生成函数  $test:内容 $length:摘要长度

    global $Briefing_Length;

    mb_regex_encoding("UTF-8");

    if (mb_strlen($text) <= $length) return $text;

    $Foremost = mb_substr($text, 0, $length);

    $re = "<(/?)

    (P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|TABLE|TR|TD|TH|INPUT|SELECT|TEXTAREA|OBJECT|A|UL|OL|LI|

    BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT|SPAN)[^>]*(>?)";

    $Single = "/BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT|BR/i";

    $Stack = array();

    $posStack = array();

    mb_ereg_search_init($Foremost, $re, &#39;i&#39;);

    while ($pos = mb_ereg_search_pos()) {

        $match = mb_ereg_search_getregs();

        /* [Child-matching Formulation]:

         

        $matche[1] : A "/" charactor indicating whether current "<...>" Friction is

        Closing Part

        $matche[2] : Element Name.

        $matche[3] : Right > of a "<...>" Friction

        */

        if ($match[1] == "") {

            $Elem = $match[2];

            if (mb_eregi($Single, $Elem) && $match[3] != "") {

                continue;

            }

?>

Salin selepas log masuk


本文地址:

转载随意,但请附上文章地址:-)

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)