-
-
/** - * fixHtmlTag
- *
- * html标签修复函数,此函数可以修复未正确闭合的 HTML 标签
- *
- * 由于不确定性因素太多,暂时提供两种模式“嵌套闭合模式”和
- * “就近闭合模式”,应该够用了。
- *
- * 这两种模式是我为了解释清楚此函数的实现而创造的两个名词,
- * 只需明白什么意思就行。
- * 1,嵌套闭合模式,NEST,为默认的闭合方式。即 "
你好"
- * 这样的 html 代码会被修改为 "
你好 "
- * 2. 近くの終了モード、CLOSE。このモードは、「
Hello Why is there no
- * Closed?」という形式のコードを「
なぜ閉じられていないのですか "
- *
- * ネストされた閉じモード (デフォルト、特別なパラメータは必要ありません) では、次のようにする必要がある
- * を渡すことができます。このように、「
Hello Me,too」のようなものは
- * 「
Hello<」に変換されます。 /p> "の形も好きです。
- * パラメータを渡す場合、インデックスは以下のように記述する必要があります。変更する必要のない設定は省略可能です
- *
- * $param = array(
- * 'html' => '', //必須
- * 'options' => ; array(
- * 'tagArray' => array();
- * 'type' => 'NEST',
- * 'length' => null,
- * ' lowerTag' => ; TRUE,
- * ' XHtmlFix' => TRUE,
- * )
- * );
- * fixHtmlTag($param);
- * string $html変更する必要がある HTML コード
- * array $tagArray は次のとおりです。ネスト モードの場合、最も近い閉じられたタグ配列が必要です。
- * string $type モード名。現在、NEST と CLOSE の 2 つのモードがサポートされています。CLOSE に設定されている場合、設定は次のようになります。パラメータ $tagArray は無視され、すべてのタグは最も近い
- * ini $length で閉じられます。特定の長さを切り詰めたい場合は、ここで値を割り当てることができます。この長さは文字列の長さを指します。 * bool $ lowerTag コード内のすべてのタグを小文字に変換するかどうか、デフォルトは TRUE です
- * bool $XHtmlFix XHTML 標準タグを処理するかどうか、つまり、
を に変換します。 * @author IT卤场
- * @version 0.2
- * @link http://bbs.it -home.org IT タンブラー
- * @link http://enenba.com/?post =19 XX
- * @param array $param 配列パラメータには特定のインデックスを割り当てる必要があります
- * @return string $result 処理された HTML コード
- * @since 2012-04-14
- */
- function fixHtmlTag($param = array() ) {
- $html = '';
- $tagArray = array();
- $length = TRUE;
//まず 1 次元配列、つまり $html と $options (パラメーターが指定されている場合) を取得します
- extract($param);
if (isset($options)) { - extract($options)
- }< ;/p>
$result = '';返されるコード
- $tagStack = array(); //array_push() と array_pop() でシミュレートされたタグ スタック
- $contents = array(); //HTML タグを格納するために使用されます
- $len = 0;文字列の長さ
//終了マーク$isClosedを設定します。デフォルトはTRUEです。近くで閉じる必要がある場合は、開始タグとの一致に成功した後、その値はfalseになります。閉じると、これは true です
- $isClosed = true;
//処理するすべてのタグを小文字に変換します
- $tagArray = array_map('strto lower ', $tagArray);
//「正当な」単一の閉じられたタグ
- $singleTagArray = array(
- '
- '
- '
- '
- '< ;hr',
- '
- '
- );
//検証一致パターン $type 、デフォルトは NEST モードです
- $type = strtoupper($ type);
- if (!in_array($type, array('NEST', 'CLOSE'))) {
- $type = 'NEST';// ペアの使用< と > を区切り文字として、元の HTML タグとタグ内の文字列を配列に入れます
- $contents = preg_split("/(<[^> ]+?>)/si", $html , -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
foreach ($contents as $tag) {
- if ('' == trim($ tag)) {
- $result .= $tag;
- Continue;
- }
// などの標準の単一の閉じたタグと一致します
- if (preg_match("/ <(w+)[^/>]*? />/si", $tag)) {
- $result .= $tag;
- continue;
- }
// 開始タグと一致し、それが単一タグの場合は、ポップスタックから削除します
- else if (preg_match("/<(w+)[^/>]*?>/si", $tag, $match)) {
- //if 前のラベルが閉じられていない場合、前のラベルは最も近い閉じたタイプに属します
- //それを閉じて前のラベルをポップします
//ラベルが閉じていない場合
- if (false === $ isClosed) {
- //近くを閉じるモード、近くにあるすべてのタグを直接閉じます
- if ('CLOSE' == $type) {
- $result .= '' .end($tagStack) '>'; );
- }
- //デフォルトのネスト モード、最も近い終了パラメータによって提供されるタグ
- else {
- if (in_array(end($tagStack), $tagArray)) {
- $result .= '< ;/' . ($tagStack) '>array_pop($tagStack);
//パラメータ $ lowerTag が TRUE の場合、タグ名を小文字に変換します
- $matchLower = $ lowerTag == TRUE ? strto lower($match[1]) : $match[1] ;
$tag = str_replace('<' . $match[1], '<' . $matchLower, $tag);
- //新しいタグの組み合わせを開始します
- $result . = $tag;
- array_push($tagStack, $matchLower);
// 合意された単一タグに属している場合は、それを閉じてスタックから取り出します
- foreach ($singleTagArray as $singleTag) {
- if (stripos($tag, $singleTag) !== false) {
- if ($XHtmlFix == TRUE) {
- $tag = str_replace('>', ' />', $ tag);
- }
- array_pop($tagStack);
- }
- }
//ニアクローズモード、ステータスが非クローズに変更
- if ('CLOSE' == $type) {
- $ isClosed = false;
- }
- //デフォルトのネスト モード、タグが指定された $tagArray にある場合、ステータスは unclosed に変更されます
- else {
- if (in_array($matchLower, $tagArray)) {
- $isClosed = false;
- }
- }
- unset($matchLower);
- }
//必要に応じて終了タグをマッチさせてスタックからポップします
- else if (preg_match("/) (w+)[^/> ]*?>/si", $tag, $match)) {
//パラメータ $ lowerTag が TRUE の場合、タグ名を次のように変換しますlowercase
- $matchLower = $ lowerTag == TRUE ? strto lower($match[1]) : $match[1];
if (end($tagStack) == $matchLower) {
- $isClosed = true; //マッチ完了、タグクロージャ
- $tag = str_replace('' . $match[1], '' . $matchLower, $tag); ;
- array_pop($tagStack);
- }
- unset($matchLower);
- }
// $result を直接接続します
- else if (preg_match("// si", $tag)) {
- $result .= $tag;
- }
//文字列を $result に入れて切り捨て操作を実行します
- else {
- if (is_null ($length) || $len + mb_strlen($tag) < $length) {
- $result .= $tag;
- $len += mb_strlen($tag); }
- $str = mb_substr($ tag, 0, $length - $len + 1);
- $result .= $str;
- }
- }
- }
//スタックには未使用の値がまだあります。閉じられたタグは $result
- while (!empty($tagStack)) {
- $result .= '' . array_pop($tagStack) に接続されています。 ;
- }
- $result を返す
- }
- ?>
-
-
-
- コードをコピーします
|