<?php include_once '../doc-typo3-funcs.php'; $doxygen_vars = array( "title" => "TYPO3 4.0.1: typo3_src-4.0.1/t3lib/class.t3lib_parsehtml.php Source File", "datetime" => "Sat Dec 2 19:22:18 2006", "date" => "2 Dec 2006", "doxygenversion" => "1.4.6", "projectname" => "TYPO3 4.0.1", "projectnumber" => "4.0.1" ); get_header($doxygen_vars); ?> <!-- Generated by Doxygen 1.4.6 --> <div class="tabs"> <ul> <li><a href="main.html"><span>Main Page</span></a></li> <li><a href="namespaces.html"><span>Namespaces</span></a></li> <li><a href="classes.html"><span>Classes</span></a></li> <li id="current"><a href="files.html"><span>Files</span></a></li> <li><a href="dirs.html"><span>Directories</span></a></li> <li><a href="pages.html"><span>Related Pages</span></a></li> <li><a href="examples.html"><span>Examples</span></a></li> <li> <form action="search.php" method="get"> <table cellspacing="0" cellpadding="0" border="0"> <tr> <td><label> <u>S</u>earch for </label></td> <td><input type="text" name="query" value="" size="20" accesskey="s"/></td> </tr> </table> </form> </li> </ul></div> <div class="nav"> <a class="el" href="dir_c8daf1ad746050abf985cc546c89e248.html">typo3_src-4.0.1</a> » <a class="el" href="dir_9d0e5c424a38b69aeeedc616a9634e5f.html">t3lib</a></div> <h1>class.t3lib_parsehtml.php</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <?php <a name="l00002"></a>00002 <span class="comment">/***************************************************************</span> <a name="l00003"></a>00003 <span class="comment">* Copyright notice</span> <a name="l00004"></a>00004 <span class="comment">*</span> <a name="l00005"></a>00005 <span class="comment">* (c) 1999-2006 Kasper Skaarhoj (kasperYYYY@typo3.com)</span> <a name="l00006"></a>00006 <span class="comment">* All rights reserved</span> <a name="l00007"></a>00007 <span class="comment">*</span> <a name="l00008"></a>00008 <span class="comment">* This script is part of the TYPO3 project. The TYPO3 project is</span> <a name="l00009"></a>00009 <span class="comment">* free software; you can redistribute it and/or modify</span> <a name="l00010"></a>00010 <span class="comment">* it under the terms of the GNU General Public License as published by</span> <a name="l00011"></a>00011 <span class="comment">* the Free Software Foundation; either version 2 of the License, or</span> <a name="l00012"></a>00012 <span class="comment">* (at your option) any later version.</span> <a name="l00013"></a>00013 <span class="comment">*</span> <a name="l00014"></a>00014 <span class="comment">* The GNU General Public License can be found at</span> <a name="l00015"></a>00015 <span class="comment">* http://www.gnu.org/copyleft/gpl.html.</span> <a name="l00016"></a>00016 <span class="comment">* A copy is found in the textfile GPL.txt and important notices to the license</span> <a name="l00017"></a>00017 <span class="comment">* from the author is found in LICENSE.txt distributed with these scripts.</span> <a name="l00018"></a>00018 <span class="comment">*</span> <a name="l00019"></a>00019 <span class="comment">*</span> <a name="l00020"></a>00020 <span class="comment">* This script is distributed in the hope that it will be useful,</span> <a name="l00021"></a>00021 <span class="comment">* but WITHOUT ANY WARRANTY; without even the implied warranty of</span> <a name="l00022"></a>00022 <span class="comment">* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span> <a name="l00023"></a>00023 <span class="comment">* GNU General Public License for more details.</span> <a name="l00024"></a>00024 <span class="comment">*</span> <a name="l00025"></a>00025 <span class="comment">* This copyright notice MUST APPEAR in all copies of the script!</span> <a name="l00026"></a>00026 <span class="comment">***************************************************************/</span> <a name="l00106"></a><a class="code" href="classt3lib__parsehtml.html">00106</a> <span class="keyword">class </span><a class="code" href="classt3lib__parsehtml.html">t3lib_parsehtml</a> { <a name="l00107"></a><a class="code" href="classt3lib__parsehtml.html#3b39003c4f0bbd9f142222525713b75b">00107</a> var <a class="code" href="classt3lib__parsehtml.html#3b39003c4f0bbd9f142222525713b75b">$caseShift_cache</a>=array(); <a name="l00108"></a>00108 <a name="l00109"></a>00109 <a name="l00110"></a>00110 <span class="comment">// *******************************************'</span> <a name="l00111"></a>00111 <span class="comment">// COPY FROM class.tslib_content.php: / BEGIN</span> <a name="l00112"></a>00112 <span class="comment">// substituteSubpart</span> <a name="l00113"></a>00113 <span class="comment">// Cleaned locally 2/2003 !!!! (so different from tslib_content version)</span> <a name="l00114"></a>00114 <span class="comment">// *******************************************'</span> <a name="l00115"></a>00115 <a name="l00123"></a><a class="code" href="classt3lib__parsehtml.html#2cad189468200f3caedca5163ddc40d4">00123</a> function <a class="code" href="classt3lib__parsehtml.html#2cad189468200f3caedca5163ddc40d4">getSubpart</a>($content, $marker) { <a name="l00124"></a>00124 $start = strpos($content, $marker); <a name="l00125"></a>00125 <span class="keywordflow">if</span> ($start===<span class="keyword">false</span>) { <span class="keywordflow">return</span> ''; } <a name="l00126"></a>00126 $start += strlen($marker); <a name="l00127"></a>00127 $stop = strpos($content, $marker, $start); <a name="l00128"></a>00128 <span class="comment">// Q: What shall get returned if no stop marker is given /*everything till the end*/ or nothing</span> <a name="l00129"></a>00129 <span class="keywordflow">if</span> ($stop===<span class="keyword">false</span>) { <span class="keywordflow">return</span> <span class="comment">/*substr($content, $start)*/</span> ''; } <a name="l00130"></a>00130 $content = substr($content, $start, $stop-$start); <a name="l00131"></a>00131 $matches = array(); <a name="l00132"></a>00132 <span class="keywordflow">if</span> (preg_match('/^([^\<]*\-\-\>)(.*)(\<\!\-\-[^\>]*)$/s', $content, $matches)===1) { <a name="l00133"></a>00133 <span class="keywordflow">return</span> $matches[2]; <a name="l00134"></a>00134 } <a name="l00135"></a>00135 $matches = array(); <a name="l00136"></a>00136 <span class="keywordflow">if</span> (preg_match('/(.*)(\<\!\-\-[^\>]*)$/s', $content, $matches)===1) { <a name="l00137"></a>00137 <span class="keywordflow">return</span> $matches[1]; <a name="l00138"></a>00138 } <a name="l00139"></a>00139 $matches = array(); <a name="l00140"></a>00140 <span class="keywordflow">if</span> (preg_match('/^([^\<]*\-\-\>)(.*)$/s', $content, $matches)===1) { <a name="l00141"></a>00141 <span class="keywordflow">return</span> $matches[2]; <a name="l00142"></a>00142 } <a name="l00143"></a>00143 <span class="keywordflow">return</span> $content; <a name="l00144"></a>00144 } <a name="l00145"></a>00145 <a name="l00156"></a><a class="code" href="classt3lib__parsehtml.html#496b21a1065d4da04682e398ee8bcef4">00156</a> function <a class="code" href="classt3lib__parsehtml.html#496b21a1065d4da04682e398ee8bcef4">substituteSubpart</a>($content,$marker,$subpartContent,$recursive=1,$keepMarker=0) { <a name="l00157"></a>00157 $start = strpos($content, $marker); <a name="l00158"></a>00158 <span class="keywordflow">if</span> ($start===<span class="keyword">false</span>) { <span class="keywordflow">return</span> $content; } <a name="l00159"></a>00159 $startAM = $start+strlen($marker); <a name="l00160"></a>00160 $stop = strpos($content, $marker, $startAM); <a name="l00161"></a>00161 <span class="keywordflow">if</span> ($stop===<span class="keyword">false</span>) { <span class="keywordflow">return</span> $content; } <a name="l00162"></a>00162 $stopAM = $stop+strlen($marker); <a name="l00163"></a>00163 $before = substr($content, 0, $start); <a name="l00164"></a>00164 $after = substr($content, $stopAM); <a name="l00165"></a>00165 $between = substr($content, $startAM, $stop-$startAM); <a name="l00166"></a>00166 <a name="l00167"></a>00167 <span class="keywordflow">if</span> ($recursive) { <a name="l00168"></a>00168 $after = <a class="code" href="classt3lib__parsehtml.html#496b21a1065d4da04682e398ee8bcef4">t3lib_parsehtml::substituteSubpart</a>($after, $marker, $subpartContent, $recursive, $keepMarker); <a name="l00169"></a>00169 } <a name="l00170"></a>00170 <a name="l00171"></a>00171 <span class="keywordflow">if</span> ($keepMarker) { <a name="l00172"></a>00172 $matches = array(); <a name="l00173"></a>00173 <span class="keywordflow">if</span> (preg_match('/^([^\<]*\-\-\>)(.*)(\<\!\-\-[^\>]*)$/s', $between, $matches)===1) { <a name="l00174"></a>00174 $before .= $marker.$matches[1]; <a name="l00175"></a>00175 $between = $matches[2]; <a name="l00176"></a>00176 $after = $matches[3].$marker.$after; <a name="l00177"></a>00177 } elseif (preg_match('/^(.*)(\<\!\-\-[^\>]*)$/s', $between, $matches)===1) { <a name="l00178"></a>00178 $before .= $marker; <a name="l00179"></a>00179 $between = $matches[1]; <a name="l00180"></a>00180 $after = $matches[2].$marker.$after; <a name="l00181"></a>00181 } elseif (preg_match('/^([^\<]*\-\-\>)(.*)$/s', $between, $matches)===1) { <a name="l00182"></a>00182 $before .= $marker.$matches[1]; <a name="l00183"></a>00183 $between = $matches[2]; <a name="l00184"></a>00184 $after = $marker.$after; <a name="l00185"></a>00185 } <span class="keywordflow">else</span> { <a name="l00186"></a>00186 $before .= $marker; <a name="l00187"></a>00187 $after = $marker.$after; <a name="l00188"></a>00188 } <a name="l00189"></a>00189 } <span class="keywordflow">else</span> { <a name="l00190"></a>00190 $matches = array(); <a name="l00191"></a>00191 <span class="keywordflow">if</span> (preg_match('/^(.*)\<\!\-\-[^\>]*$/s', $before, $matches)===1) { <a name="l00192"></a>00192 $before = $matches[1]; <a name="l00193"></a>00193 } <a name="l00194"></a>00194 <span class="keywordflow">if</span> (is_array($subpartContent)) { <a name="l00195"></a>00195 $matches = array(); <a name="l00196"></a>00196 <span class="keywordflow">if</span> (preg_match('/^([^\<]*\-\-\>)(.*)(\<\!\-\-[^\>]*)$/s', $between, $matches)===1) { <a name="l00197"></a>00197 $between = $matches[2]; <a name="l00198"></a>00198 } elseif (preg_match('/^(.*)(\<\!\-\-[^\>]*)$/s', $between, $matches)===1) { <a name="l00199"></a>00199 $between = $matches[1]; <a name="l00200"></a>00200 } elseif (preg_match('/^([^\<]*\-\-\>)(.*)$/s', $between, $matches)===1) { <a name="l00201"></a>00201 $between = $matches[2]; <a name="l00202"></a>00202 } <a name="l00203"></a>00203 } <a name="l00204"></a>00204 $matches = array(); <a name="l00205"></a>00205 <span class="keywordflow">if</span> (preg_match('/^[^\<]*\-\-\>(.*)$/s', $after, $matches)===1) { <a name="l00206"></a>00206 $after = $matches[1]; <a name="l00207"></a>00207 } <a name="l00208"></a>00208 } <a name="l00209"></a>00209 <a name="l00210"></a>00210 <span class="keywordflow">if</span> (is_array($subpartContent)) { <a name="l00211"></a>00211 $between = $subpartContent[0].$between.$subpartContent[1]; <a name="l00212"></a>00212 } <span class="keywordflow">else</span> { <a name="l00213"></a>00213 $between = $subpartContent; <a name="l00214"></a>00214 } <a name="l00215"></a>00215 <a name="l00216"></a>00216 <span class="keywordflow">return</span> $before.$between.$after; <a name="l00217"></a>00217 } <a name="l00218"></a>00218 <a name="l00219"></a>00219 <a name="l00220"></a>00220 <span class="comment">// *******************************************'</span> <a name="l00221"></a>00221 <span class="comment">// COPY FROM class.tslib_content.php: / END</span> <a name="l00222"></a>00222 <span class="comment">// *******************************************'</span> <a name="l00223"></a>00223 <a name="l00224"></a>00224 <a name="l00225"></a>00225 <a name="l00226"></a>00226 <a name="l00227"></a>00227 <a name="l00228"></a>00228 <a name="l00229"></a>00229 <a name="l00230"></a>00230 <span class="comment">/************************************</span> <a name="l00231"></a>00231 <span class="comment"> *</span> <a name="l00232"></a>00232 <span class="comment"> * Parsing HTML code</span> <a name="l00233"></a>00233 <span class="comment"> *</span> <a name="l00234"></a>00234 <span class="comment"> ************************************/</span> <a name="l00235"></a>00235 <a name="l00247"></a><a class="code" href="classt3lib__parsehtml.html#8c67d79543ef9e46e7561a156ee2f903">00247</a> function <a class="code" href="classt3lib__parsehtml.html#8c67d79543ef9e46e7561a156ee2f903">splitIntoBlock</a>($tag,$content,$eliminateExtraEndTags=0) { <a name="l00248"></a>00248 $tags=array_unique(<a class="code" href="classt3lib__div.html#cfb87d585b85e9b32841bde40beaa96c">t3lib_div::trimExplode</a>(<span class="charliteral">','</span>,$tag,1)); <a name="l00249"></a>00249 $regexStr = '/\<\/?('.implode(<span class="charliteral">'|'</span>, $tags).')(\s*\>|\s[^\>]*\>)/si'; <a name="l00250"></a>00250 <a name="l00251"></a>00251 $parts = preg_split($regexStr, $content); <a name="l00252"></a>00252 <a name="l00253"></a>00253 $newParts=array(); <a name="l00254"></a>00254 $pointer=strlen($parts[0]); <a name="l00255"></a>00255 $buffer=$parts[0]; <a name="l00256"></a>00256 $nested=0; <a name="l00257"></a>00257 reset($parts); <a name="l00258"></a>00258 next($parts); <a name="l00259"></a>00259 <span class="keywordflow">while</span>(list($k,$v)=each($parts)) { <a name="l00260"></a>00260 $isEndTag= substr($content,$pointer,2)=='</' ? 1 : 0; <a name="l00261"></a>00261 $tagLen = strcspn(substr($content,$pointer),<span class="charliteral">'>'</span>)+1; <a name="l00262"></a>00262 <a name="l00263"></a>00263 <span class="keywordflow">if</span> (!$isEndTag) { <span class="comment">// We meet a start-tag:</span> <a name="l00264"></a>00264 <span class="keywordflow">if</span> (!$nested) { <span class="comment">// Ground level:</span> <a name="l00265"></a>00265 $newParts[]=$buffer; <span class="comment">// previous buffer stored</span> <a name="l00266"></a>00266 $buffer=''; <a name="l00267"></a>00267 } <a name="l00268"></a>00268 $nested++; <span class="comment">// We are inside now!</span> <a name="l00269"></a>00269 $mbuffer=substr($content,$pointer,strlen($v)+$tagLen); <span class="comment">// New buffer set and pointer increased</span> <a name="l00270"></a>00270 $pointer+=strlen($mbuffer); <a name="l00271"></a>00271 $buffer.=$mbuffer; <a name="l00272"></a>00272 } <span class="keywordflow">else</span> { <span class="comment">// If we meet an endtag:</span> <a name="l00273"></a>00273 $nested--; <span class="comment">// decrease nested-level</span> <a name="l00274"></a>00274 $eliminated=0; <a name="l00275"></a>00275 <span class="keywordflow">if</span> ($eliminateExtraEndTags && $nested<0) { <a name="l00276"></a>00276 $nested=0; <a name="l00277"></a>00277 $eliminated=1; <a name="l00278"></a>00278 } <span class="keywordflow">else</span> { <a name="l00279"></a>00279 $buffer.=substr($content,$pointer,$tagLen); <span class="comment">// In any case, add the endtag to current buffer and increase pointer</span> <a name="l00280"></a>00280 } <a name="l00281"></a>00281 $pointer+=$tagLen; <a name="l00282"></a>00282 <span class="keywordflow">if</span> (!$nested && !$eliminated) { <span class="comment">// if we're back on ground level, (and not by eliminating tags...</span> <a name="l00283"></a>00283 $newParts[]=$buffer; <a name="l00284"></a>00284 $buffer=''; <a name="l00285"></a>00285 } <a name="l00286"></a>00286 $mbuffer=substr($content,$pointer,strlen($v)); <span class="comment">// New buffer set and pointer increased</span> <a name="l00287"></a>00287 $pointer+=strlen($mbuffer); <a name="l00288"></a>00288 $buffer.=$mbuffer; <a name="l00289"></a>00289 } <a name="l00290"></a>00290 <a name="l00291"></a>00291 } <a name="l00292"></a>00292 $newParts[]=$buffer; <a name="l00293"></a>00293 <span class="keywordflow">return</span> $newParts; <a name="l00294"></a>00294 } <a name="l00295"></a>00295 <a name="l00308"></a><a class="code" href="classt3lib__parsehtml.html#f1a9ef4c092e088e4f88bddfc0b19ca7">00308</a> function <a class="code" href="classt3lib__parsehtml.html#f1a9ef4c092e088e4f88bddfc0b19ca7">splitIntoBlockRecursiveProc</a>($tag,$content,&$procObj,$callBackContent,$callBackTags,$level=0) { <a name="l00309"></a>00309 $parts = $this-><a class="code" href="classt3lib__parsehtml.html#8c67d79543ef9e46e7561a156ee2f903">splitIntoBlock</a>($tag,$content,TRUE); <a name="l00310"></a>00310 foreach($parts as $k => $v) { <a name="l00311"></a>00311 <span class="keywordflow">if</span> ($k%2) { <a name="l00312"></a>00312 $firstTagName = $this-><a class="code" href="classt3lib__parsehtml.html#bd430c9617018e90add4aebc4cd86ebc">getFirstTagName</a>($v, TRUE); <a name="l00313"></a>00313 $tagsArray = array(); <a name="l00314"></a>00314 $tagsArray['tag_start'] = $this-><a class="code" href="classt3lib__parsehtml.html#56fa1f5b334264eb615ab782de00a006">getFirstTag</a>($v); <a name="l00315"></a>00315 $tagsArray['tag_end'] = '</'.$firstTagName.<span class="charliteral">'>'</span>; <a name="l00316"></a>00316 $tagsArray['tag_name'] = strtolower($firstTagName); <a name="l00317"></a>00317 $tagsArray['add_level'] = 1; <a name="l00318"></a>00318 $tagsArray['content'] = $this-><a class="code" href="classt3lib__parsehtml.html#f1a9ef4c092e088e4f88bddfc0b19ca7">splitIntoBlockRecursiveProc</a>($tag,$this-><a class="code" href="classt3lib__parsehtml.html#1977dbc136106401e1041560a7f18f1a">removeFirstAndLastTag</a>($v),$procObj,$callBackContent,$callBackTags,$level+$tagsArray['add_level']); <a name="l00319"></a>00319 <a name="l00320"></a>00320 <span class="keywordflow">if</span> ($callBackTags) $tagsArray = $procObj->$callBackTags($tagsArray,$level); <a name="l00321"></a>00321 <a name="l00322"></a>00322 $parts[$k] = <a name="l00323"></a>00323 $tagsArray['tag_start']. <a name="l00324"></a>00324 $tagsArray['content']. <a name="l00325"></a>00325 $tagsArray['tag_end']; <a name="l00326"></a>00326 } <span class="keywordflow">else</span> { <a name="l00327"></a>00327 <span class="keywordflow">if</span> ($callBackContent) $parts[$k] = $procObj->$callBackContent($parts[$k],$level); <a name="l00328"></a>00328 } <a name="l00329"></a>00329 } <a name="l00330"></a>00330 <a name="l00331"></a>00331 <span class="keywordflow">return</span> implode('',$parts); <a name="l00332"></a>00332 } <a name="l00333"></a>00333 <a name="l00344"></a><a class="code" href="classt3lib__parsehtml.html#78acce4ff051ab05b62d88a3cce6c369">00344</a> function <a class="code" href="classt3lib__parsehtml.html#78acce4ff051ab05b62d88a3cce6c369">splitTags</a>($tag,$content) { <a name="l00345"></a>00345 $tags = <a class="code" href="classt3lib__div.html#cfb87d585b85e9b32841bde40beaa96c">t3lib_div::trimExplode</a>(<span class="charliteral">','</span>,$tag,1); <a name="l00346"></a>00346 $regexStr = '/\<('.implode(<span class="charliteral">'|'</span>, $tags).')(\s[^>]*)?\/?>/si'; <a name="l00347"></a>00347 $parts = preg_split($regexStr, $content); <a name="l00348"></a>00348 <a name="l00349"></a>00349 $pointer = strlen($parts[0]); <a name="l00350"></a>00350 $newParts = array(); <a name="l00351"></a>00351 $newParts[] = $parts[0]; <a name="l00352"></a>00352 reset($parts); <a name="l00353"></a>00353 next($parts); <a name="l00354"></a>00354 <span class="keywordflow">while</span>(list($k,$v)=each($parts)) { <a name="l00355"></a>00355 $tagLen = strcspn(substr($content,$pointer),<span class="charliteral">'>'</span>)+1; <a name="l00356"></a>00356 <a name="l00357"></a>00357 <span class="comment">// Set tag:</span> <a name="l00358"></a>00358 $tag = substr($content,$pointer,$tagLen); <span class="comment">// New buffer set and pointer increased</span> <a name="l00359"></a>00359 $newParts[] = $tag; <a name="l00360"></a>00360 $pointer+= strlen($tag); <a name="l00361"></a>00361 <a name="l00362"></a>00362 <span class="comment">// Set content:</span> <a name="l00363"></a>00363 $newParts[] = $v; <a name="l00364"></a>00364 $pointer+= strlen($v); <a name="l00365"></a>00365 } <a name="l00366"></a>00366 <span class="keywordflow">return</span> $newParts; <a name="l00367"></a>00367 } <a name="l00368"></a>00368 <a name="l00378"></a><a class="code" href="classt3lib__parsehtml.html#8c1b3a5a81562acb8e8f2d6eb5430598">00378</a> function <a class="code" href="classt3lib__parsehtml.html#8c1b3a5a81562acb8e8f2d6eb5430598">getAllParts</a>($parts,$tag_parts=1,$include_tag=1) { <a name="l00379"></a>00379 $newParts=array(); <a name="l00380"></a>00380 foreach ($parts as $k => $v) { <a name="l00381"></a>00381 <span class="keywordflow">if</span> (($k+($tag_parts?0:1))%2) { <a name="l00382"></a>00382 <span class="keywordflow">if</span> (!$include_tag) $v=$this-><a class="code" href="classt3lib__parsehtml.html#1977dbc136106401e1041560a7f18f1a">removeFirstAndLastTag</a>($v); <a name="l00383"></a>00383 $newParts[]=$v; <a name="l00384"></a>00384 } <a name="l00385"></a>00385 } <a name="l00386"></a>00386 <span class="keywordflow">return</span> $newParts; <a name="l00387"></a>00387 } <a name="l00388"></a>00388 <a name="l00396"></a><a class="code" href="classt3lib__parsehtml.html#1977dbc136106401e1041560a7f18f1a">00396</a> function <a class="code" href="classt3lib__parsehtml.html#1977dbc136106401e1041560a7f18f1a">removeFirstAndLastTag</a>($str) { <a name="l00397"></a>00397 <span class="comment">// End of first tag:</span> <a name="l00398"></a>00398 $start = strpos($str,<span class="charliteral">'>'</span>); <a name="l00399"></a>00399 <span class="comment">// Begin of last tag:</span> <a name="l00400"></a>00400 $end = strrpos($str,<span class="charliteral">'<'</span>); <a name="l00401"></a>00401 <span class="comment">// return</span> <a name="l00402"></a>00402 <span class="keywordflow">return</span> substr($str, $start+1, $end-$start-1); <a name="l00403"></a>00403 } <a name="l00404"></a>00404 <a name="l00412"></a><a class="code" href="classt3lib__parsehtml.html#56fa1f5b334264eb615ab782de00a006">00412</a> function <a class="code" href="classt3lib__parsehtml.html#56fa1f5b334264eb615ab782de00a006">getFirstTag</a>($str) { <a name="l00413"></a>00413 <span class="comment">// First:</span> <a name="l00414"></a>00414 $endLen = strpos($str,<span class="charliteral">'>'</span>)+1; <a name="l00415"></a>00415 <span class="keywordflow">return</span> substr($str,0,$endLen); <a name="l00416"></a>00416 } <a name="l00417"></a>00417 <a name="l00426"></a><a class="code" href="classt3lib__parsehtml.html#bd430c9617018e90add4aebc4cd86ebc">00426</a> function <a class="code" href="classt3lib__parsehtml.html#bd430c9617018e90add4aebc4cd86ebc">getFirstTagName</a>($str,$preserveCase=FALSE) { <a name="l00427"></a>00427 $matches = array(); <a name="l00428"></a>00428 <span class="keywordflow">if</span> (preg_match('/^\s*\<([^\s\>]+)(\s|\>)/', $str, $matches)===1) { <a name="l00429"></a>00429 <span class="keywordflow">if</span> (!$preserveCase) { <a name="l00430"></a>00430 <span class="keywordflow">return</span> strtoupper($matches[1]); <a name="l00431"></a>00431 } <a name="l00432"></a>00432 <span class="keywordflow">return</span> $matches[1]; <a name="l00433"></a>00433 } <a name="l00434"></a>00434 <span class="keywordflow">return</span> ''; <a name="l00435"></a>00435 } <a name="l00436"></a>00436 <a name="l00445"></a><a class="code" href="classt3lib__parsehtml.html#2d46a8e8096a73041ce71ad4eaca2094">00445</a> function <a class="code" href="classt3lib__parsehtml.html#2d46a8e8096a73041ce71ad4eaca2094">get_tag_attributes</a>($tag,$deHSC=0) { <a name="l00446"></a>00446 list($components,$metaC) = $this-><a class="code" href="classt3lib__parsehtml.html#b17aeb55455484ca2a0a3dfa71ae2c48">split_tag_attributes</a>($tag); <a name="l00447"></a>00447 $name = ''; <span class="comment">// attribute name is stored here</span> <a name="l00448"></a>00448 $valuemode = <span class="keyword">false</span>; <a name="l00449"></a>00449 $attributes = array(); <a name="l00450"></a>00450 $attributesMeta = array(); <a name="l00451"></a>00451 <span class="keywordflow">if</span> (is_array($components)) { <a name="l00452"></a>00452 foreach ($components as $key => $val) { <a name="l00453"></a>00453 <span class="keywordflow">if</span> ($val != <span class="charliteral">'='</span>) { <span class="comment">// Only if $name is set (if there is an attribute, that waits for a value), that valuemode is enabled. This ensures that the attribute is assigned it's value</span> <a name="l00454"></a>00454 <span class="keywordflow">if</span> ($valuemode) { <a name="l00455"></a>00455 <span class="keywordflow">if</span> ($name) { <a name="l00456"></a>00456 $attributes[$name] = $deHSC?<a class="code" href="classt3lib__div.html#f240b4a85b87436f4eba15dd26487991">t3lib_div::htmlspecialchars_decode</a>($val):$val; <a name="l00457"></a>00457 $attributesMeta[$name]['dashType']=$metaC[$key]; <a name="l00458"></a>00458 $name = ''; <a name="l00459"></a>00459 } <a name="l00460"></a>00460 } <span class="keywordflow">else</span> { <a name="l00461"></a>00461 <span class="keywordflow">if</span> ($namekey = preg_replace('/[^[:alnum:]_\:\-]/<span class="charliteral">','</span>',$val)) { <a name="l00462"></a>00462 $name = strtolower($namekey); <a name="l00463"></a>00463 $attributesMeta[$name]=array(); <a name="l00464"></a>00464 $attributesMeta[$name]['origTag']=$namekey; <a name="l00465"></a>00465 $attributes[$name] = ''; <a name="l00466"></a>00466 } <a name="l00467"></a>00467 } <a name="l00468"></a>00468 $valuemode = <span class="keyword">false</span>; <a name="l00469"></a>00469 } <span class="keywordflow">else</span> { <a name="l00470"></a>00470 $valuemode = <span class="keyword">true</span>; <a name="l00471"></a>00471 } <a name="l00472"></a>00472 } <a name="l00473"></a>00473 <span class="keywordflow">return</span> array($attributes,$attributesMeta); <a name="l00474"></a>00474 } <a name="l00475"></a>00475 } <a name="l00476"></a>00476 <a name="l00486"></a><a class="code" href="classt3lib__parsehtml.html#b17aeb55455484ca2a0a3dfa71ae2c48">00486</a> function <a class="code" href="classt3lib__parsehtml.html#b17aeb55455484ca2a0a3dfa71ae2c48">split_tag_attributes</a>($tag) { <a name="l00487"></a>00487 $matches = array(); <a name="l00488"></a>00488 <span class="keywordflow">if</span> (preg_match('/(\<[^\s]+\s+)?(.*?)\s*(\>)?$/s', $tag, $matches)!==1) { <a name="l00489"></a>00489 <span class="keywordflow">return</span> array(array(), array()); <a name="l00490"></a>00490 } <a name="l00491"></a>00491 $tag_tmp = $matches[2]; <a name="l00492"></a>00492 <a name="l00493"></a>00493 $metaValue = array(); <a name="l00494"></a>00494 $value = array(); <a name="l00495"></a>00495 $matches = array(); <a name="l00496"></a>00496 <span class="keywordflow">if</span> (preg_match_all('/(<span class="stringliteral">"[^"</span>]*<span class="stringliteral">"|\'[^\']*\'|[^\s"</span>\'\=]+|\=)/s', $tag_tmp, $matches)>0) { <a name="l00497"></a>00497 foreach ($matches[1] as $part) { <a name="l00498"></a>00498 $firstChar = substr($part, 0, 1); <a name="l00499"></a>00499 <span class="keywordflow">if</span> ($firstChar==<span class="charliteral">'"'</span> || $firstChar==<span class="stringliteral">"'"</span>) { <a name="l00500"></a>00500 $metaValue[] = $firstChar; <a name="l00501"></a>00501 $value[] = substr($part, 1, -1); <a name="l00502"></a>00502 } <span class="keywordflow">else</span> { <a name="l00503"></a>00503 $metaValue[] = ''; <a name="l00504"></a>00504 $value[] = $part; <a name="l00505"></a>00505 } <a name="l00506"></a>00506 } <a name="l00507"></a>00507 } <a name="l00508"></a>00508 <span class="keywordflow">return</span> array($value,$metaValue); <a name="l00509"></a>00509 } <a name="l00510"></a>00510 <a name="l00524"></a><a class="code" href="classt3lib__parsehtml.html#a67392c497d3718ae004af8566274c9e">00524</a> function <a class="code" href="classt3lib__parsehtml.html#a67392c497d3718ae004af8566274c9e">checkTagTypeCounts</a>($content,$blockTags='a,b,blockquote,body,div,em,font,form,h1,h2,h3,h4,h5,h6,i,li,map,ol,option,p,pre,select,span,strong,table,td,textarea,tr,u,ul', $soloTags='br,hr,img,input,area') { <a name="l00525"></a>00525 $content = strtolower($content); <a name="l00526"></a>00526 $analyzedOutput=array(); <a name="l00527"></a>00527 $analyzedOutput['counts']=array(); <span class="comment">// Counts appearances of start-tags</span> <a name="l00528"></a>00528 $analyzedOutput['errors']=array(); <span class="comment">// Lists ERRORS</span> <a name="l00529"></a>00529 $analyzedOutput['warnings']=array(); <span class="comment">// Lists warnings.</span> <a name="l00530"></a>00530 $analyzedOutput['blocks']=array(); <span class="comment">// Lists stats for block-tags</span> <a name="l00531"></a>00531 $analyzedOutput['solo']=array(); <span class="comment">// Lists stats for solo-tags</span> <a name="l00532"></a>00532 <a name="l00533"></a>00533 <span class="comment">// Block tags, must have endings...</span> <a name="l00534"></a>00534 $blockTags = explode(<span class="charliteral">','</span>,$blockTags); <a name="l00535"></a>00535 foreach($blockTags as $tagName) { <a name="l00536"></a>00536 $countBegin = count(preg_split('/\<'.$tagName.'(\s|\>)/s',$content))-1; <a name="l00537"></a>00537 $countEnd = count(preg_split('/\<\/'.$tagName.'(\s|\>)/s',$content))-1; <a name="l00538"></a>00538 $analyzedOutput['blocks'][$tagName]=array($countBegin,$countEnd,$countBegin-$countEnd); <a name="l00539"></a>00539 <span class="keywordflow">if</span> ($countBegin) $analyzedOutput['counts'][$tagName]=$countBegin; <a name="l00540"></a>00540 <span class="keywordflow">if</span> ($countBegin-$countEnd) { <a name="l00541"></a>00541 <span class="keywordflow">if</span> ($countBegin-$countEnd > 0) { <a name="l00542"></a>00542 $analyzedOutput['errors'][$tagName]='There were more start-tags ('.$countBegin.') than end-tags ('.$countEnd.') <span class="keywordflow">for</span> the element <span class="stringliteral">"'.$tagName.'"</span>. There should be an equal amount!'; <a name="l00543"></a>00543 } <span class="keywordflow">else</span> { <a name="l00544"></a>00544 $analyzedOutput['warnings'][$tagName]='There were more end-tags ('.$countEnd.') than start-tags ('.$countBegin.') <span class="keywordflow">for</span> the element <span class="stringliteral">"'.$tagName.'"</span>. There should be an equal amount! However the problem is not fatal.'; <a name="l00545"></a>00545 } <a name="l00546"></a>00546 } <a name="l00547"></a>00547 } <a name="l00548"></a>00548 <a name="l00549"></a>00549 <span class="comment">// Solo tags, must NOT have endings...</span> <a name="l00550"></a>00550 $soloTags = explode(<span class="charliteral">','</span>,$soloTags); <a name="l00551"></a>00551 foreach($soloTags as $tagName) { <a name="l00552"></a>00552 $countBegin = count(preg_split('/\<'.$tagName.'(\s|\>)/s',$content))-1; <a name="l00553"></a>00553 $countEnd = count(preg_split('/\<\/'.$tagName.'(\s|\>)/s',$content))-1; <a name="l00554"></a>00554 $analyzedOutput['solo'][$tagName]=array($countBegin,$countEnd); <a name="l00555"></a>00555 <span class="keywordflow">if</span> ($countBegin) $analyzedOutput['counts'][$tagName]=$countBegin; <a name="l00556"></a>00556 <span class="keywordflow">if</span> ($countEnd) { <a name="l00557"></a>00557 $analyzedOutput['warnings'][$tagName]='There were end-tags found ('.$countEnd.') <span class="keywordflow">for</span> the element <span class="stringliteral">"'.$tagName.'"</span>. This was not expected (although XHTML technically allows it).'; <a name="l00558"></a>00558 } <a name="l00559"></a>00559 } <a name="l00560"></a>00560 <a name="l00561"></a>00561 <span class="keywordflow">return</span> $analyzedOutput; <a name="l00562"></a>00562 } <a name="l00563"></a>00563 <a name="l00564"></a>00564 <a name="l00565"></a>00565 <a name="l00566"></a>00566 <a name="l00567"></a>00567 <a name="l00568"></a>00568 <a name="l00569"></a>00569 <a name="l00570"></a>00570 <a name="l00571"></a>00571 <a name="l00572"></a>00572 <a name="l00573"></a>00573 <a name="l00574"></a>00574 <a name="l00575"></a>00575 <span class="comment">/*********************************</span> <a name="l00576"></a>00576 <span class="comment"> *</span> <a name="l00577"></a>00577 <span class="comment"> * Clean HTML code</span> <a name="l00578"></a>00578 <span class="comment"> *</span> <a name="l00579"></a>00579 <span class="comment"> *********************************/</span> <a name="l00580"></a>00580 <a name="l00617"></a><a class="code" href="classt3lib__parsehtml.html#cdce5d51480e2f0814fdeddd70795847">00617</a> function <a class="code" href="classt3lib__parsehtml.html#cdce5d51480e2f0814fdeddd70795847">HTMLcleaner</a>($content, $tags=array(),$keepAll=0,$hSC=0,$addConfig=array()) { <a name="l00618"></a>00618 $newContent = array(); <a name="l00619"></a>00619 $tokArr = explode(<span class="charliteral">'<'</span>,$content); <a name="l00620"></a>00620 $newContent[] = $this->processContent(current($tokArr),$hSC,$addConfig); <a name="l00621"></a>00621 next($tokArr); <a name="l00622"></a>00622 <a name="l00623"></a>00623 $c = 1; <a name="l00624"></a>00624 $tagRegister = array(); <a name="l00625"></a>00625 $tagStack = array(); <a name="l00626"></a>00626 <span class="keywordflow">while</span>(list(,$tok)=each($tokArr)) { <a name="l00627"></a>00627 $firstChar = substr($tok,0,1); <a name="l00628"></a>00628 <span class="preprocessor"># if (strcmp(trim($firstChar),'')) { // It is a tag...</span> <a name="l00629"></a>00629 <span class="preprocessor"></span> <span class="keywordflow">if</span> (preg_match('/[[:alnum:]\/]/',$firstChar)==1) { <span class="comment">// It is a tag... (first char is a-z0-9 or /) (fixed 19/01 2004). This also avoids triggering on <?xml..> and <!DOCTYPE..></span> <a name="l00630"></a>00630 $tagEnd = strpos($tok,<span class="charliteral">'>'</span>); <a name="l00631"></a>00631 <span class="keywordflow">if</span> ($tagEnd) { <span class="comment">// If there is and end-bracket... tagEnd can't be 0 as the first character can't be a ></span> <a name="l00632"></a>00632 $endTag = $firstChar==<span class="charliteral">'/'</span> ? 1 : 0; <a name="l00633"></a>00633 $tagContent = substr($tok,$endTag,$tagEnd-$endTag); <a name="l00634"></a>00634 $tagParts = preg_split('/\s+/s',$tagContent,2); <a name="l00635"></a>00635 $tagName = strtolower($tagParts[0]); <a name="l00636"></a>00636 <span class="keywordflow">if</span> (isset($tags[$tagName])) { <a name="l00637"></a>00637 <span class="keywordflow">if</span> (is_array($tags[$tagName])) { <span class="comment">// If there is processing to do for the tag:</span> <a name="l00638"></a>00638 <a name="l00639"></a>00639 <span class="keywordflow">if</span> (!$endTag) { <span class="comment">// If NOT an endtag, do attribute processing (added dec. 2003)</span> <a name="l00640"></a>00640 <span class="comment">// Override attributes</span> <a name="l00641"></a>00641 <span class="keywordflow">if</span> (strcmp($tags[$tagName]['overrideAttribs'],'')) { <a name="l00642"></a>00642 $tagParts[1]=$tags[$tagName]['overrideAttribs']; <a name="l00643"></a>00643 } <a name="l00644"></a>00644 <a name="l00645"></a>00645 <span class="comment">// Allowed tags</span> <a name="l00646"></a>00646 <span class="keywordflow">if</span> (strcmp($tags[$tagName]['allowedAttribs'],'')) { <a name="l00647"></a>00647 <span class="keywordflow">if</span> (!strcmp($tags[$tagName]['allowedAttribs'],<span class="charliteral">'0'</span>)) { <span class="comment">// No attribs allowed</span> <a name="l00648"></a>00648 $tagParts[1]=''; <a name="l00649"></a>00649 } elseif (trim($tagParts[1])) { <a name="l00650"></a>00650 $tagAttrib = $this-><a class="code" href="classt3lib__parsehtml.html#2d46a8e8096a73041ce71ad4eaca2094">get_tag_attributes</a>($tagParts[1]); <a name="l00651"></a>00651 $tagParts[1]=''; <a name="l00652"></a>00652 $newTagAttrib = array(); <a name="l00653"></a>00653 <span class="keywordflow">if</span> (!($tList = $tags[$tagName]['_allowedAttribs'])) { <a name="l00654"></a>00654 <span class="comment">// Just explode attribts for tag once</span> <a name="l00655"></a>00655 $tList = $tags[$tagName]['_allowedAttribs'] = <a class="code" href="classt3lib__div.html#cfb87d585b85e9b32841bde40beaa96c">t3lib_div::trimExplode</a>(<span class="charliteral">','</span>,strtolower($tags[$tagName]['allowedAttribs']),1); <a name="l00656"></a>00656 } <a name="l00657"></a>00657 foreach ($tList as $allowTag) { <a name="l00658"></a>00658 <span class="keywordflow">if</span> (isset($tagAttrib[0][$allowTag])) $newTagAttrib[$allowTag]=$tagAttrib[0][$allowTag]; <a name="l00659"></a>00659 } <a name="l00660"></a>00660 $tagParts[1]=$this->compileTagAttribs($newTagAttrib,$tagAttrib[1]); <a name="l00661"></a>00661 } <a name="l00662"></a>00662 } <a name="l00663"></a>00663 <a name="l00664"></a>00664 <span class="comment">// Fixed attrib values</span> <a name="l00665"></a>00665 <span class="keywordflow">if</span> (is_array($tags[$tagName]['fixAttrib'])) { <a name="l00666"></a>00666 $tagAttrib = $this-><a class="code" href="classt3lib__parsehtml.html#2d46a8e8096a73041ce71ad4eaca2094">get_tag_attributes</a>($tagParts[1]); <a name="l00667"></a>00667 $tagParts[1]=''; <a name="l00668"></a>00668 reset($tags[$tagName]['fixAttrib']); <a name="l00669"></a>00669 <span class="keywordflow">while</span>(list($attr,$params)=each($tags[$tagName]['fixAttrib'])) { <a name="l00670"></a>00670 <span class="keywordflow">if</span> (strlen($params['set'])) $tagAttrib[0][$attr] = $params['set']; <a name="l00671"></a>00671 <span class="keywordflow">if</span> (strlen($params['unset'])) unset($tagAttrib[0][$attr]); <a name="l00672"></a>00672 <span class="keywordflow">if</span> (strcmp($params['<span class="keywordflow">default</span>'],'') && !isset($tagAttrib[0][$attr])) $tagAttrib[0][$attr]=$params['<span class="keywordflow">default</span>']; <a name="l00673"></a>00673 <span class="keywordflow">if</span> ($params['always'] || isset($tagAttrib[0][$attr])) { <a name="l00674"></a>00674 <span class="keywordflow">if</span> ($params['trim']) {$tagAttrib[0][$attr]=trim($tagAttrib[0][$attr]);} <a name="l00675"></a>00675 <span class="keywordflow">if</span> ($params['intval']) {$tagAttrib[0][$attr]=intval($tagAttrib[0][$attr]);} <a name="l00676"></a>00676 <span class="keywordflow">if</span> ($params['lower']) {$tagAttrib[0][$attr]=strtolower($tagAttrib[0][$attr]);} <a name="l00677"></a>00677 <span class="keywordflow">if</span> ($params['upper']) {$tagAttrib[0][$attr]=strtoupper($tagAttrib[0][$attr]);} <a name="l00678"></a>00678 <span class="keywordflow">if</span> ($params['range']) { <a name="l00679"></a>00679 <span class="keywordflow">if</span> (isset($params['range'][1])) { <a name="l00680"></a>00680 $tagAttrib[0][$attr]=<a class="code" href="classt3lib__div.html#79f6a47a7658e28e3f65666f8ebc19f8">t3lib_div::intInRange</a>($tagAttrib[0][$attr],intval($params['range'][0]),intval($params['range'][1])); <a name="l00681"></a>00681 } <span class="keywordflow">else</span> { <a name="l00682"></a>00682 $tagAttrib[0][$attr]=<a class="code" href="classt3lib__div.html#79f6a47a7658e28e3f65666f8ebc19f8">t3lib_div::intInRange</a>($tagAttrib[0][$attr],intval($params['range'][0])); <a name="l00683"></a>00683 } <a name="l00684"></a>00684 } <a name="l00685"></a>00685 <span class="keywordflow">if</span> (is_array($params['list'])) { <a name="l00686"></a>00686 <span class="keywordflow">if</span> (!in_array($this->caseShift($tagAttrib[0][$attr],$params['casesensitiveComp']),$this->caseShift($params['list'],$params['casesensitiveComp'],$tagName))) $tagAttrib[0][$attr]=$params['list'][0]; <a name="l00687"></a>00687 } <a name="l00688"></a>00688 <span class="keywordflow">if</span> (($params['removeIfFalse'] && $params['removeIfFalse']!='blank' && !$tagAttrib[0][$attr]) || ($params['removeIfFalse']=='blank' && !strcmp($tagAttrib[0][$attr],''))) { <a name="l00689"></a>00689 unset($tagAttrib[0][$attr]); <a name="l00690"></a>00690 } <a name="l00691"></a>00691 <span class="keywordflow">if</span> (strcmp($params['removeIfEquals'],'') && !strcmp($this->caseShift($tagAttrib[0][$attr],$params['casesensitiveComp']),$this->caseShift($params['removeIfEquals'],$params['casesensitiveComp']))) { <a name="l00692"></a>00692 unset($tagAttrib[0][$attr]); <a name="l00693"></a>00693 } <a name="l00694"></a>00694 <span class="keywordflow">if</span> ($params['prefixLocalAnchors']) { <a name="l00695"></a>00695 <span class="keywordflow">if</span> (substr($tagAttrib[0][$attr],0,1)==<span class="charliteral">'#'</span>) { <a name="l00696"></a>00696 $prefix = <a class="code" href="classt3lib__div.html#cd7ecd00954e9a6b0c14eb23cf875d3f">t3lib_div::getIndpEnv</a>('TYPO3_REQUEST_URL'); <a name="l00697"></a>00697 $tagAttrib[0][$attr] = $prefix.$tagAttrib[0][$attr]; <a name="l00698"></a>00698 <span class="keywordflow">if</span> ($params['prefixLocalAnchors']==2 && <a class="code" href="classt3lib__div.html#28d04de62f18c544013a1f75886d5c77">t3lib_div::isFirstPartOfStr</a>($prefix,<a class="code" href="classt3lib__div.html#cd7ecd00954e9a6b0c14eb23cf875d3f">t3lib_div::getIndpEnv</a>('TYPO3_SITE_URL'))) { <a name="l00699"></a>00699 $tagAttrib[0][$attr] = substr($tagAttrib[0][$attr],strlen(<a class="code" href="classt3lib__div.html#cd7ecd00954e9a6b0c14eb23cf875d3f">t3lib_div::getIndpEnv</a>('TYPO3_SITE_URL'))); <a name="l00700"></a>00700 } <a name="l00701"></a>00701 } <a name="l00702"></a>00702 } <a name="l00703"></a>00703 <span class="keywordflow">if</span> ($params['prefixRelPathWith']) { <a name="l00704"></a>00704 $urlParts = parse_url($tagAttrib[0][$attr]); <a name="l00705"></a>00705 <span class="keywordflow">if</span> (!$urlParts['scheme'] && substr($urlParts['path'],0,1)!=<span class="charliteral">'/'</span>) { <span class="comment">// If it is NOT an absolute URL (by http: or starting "/")</span> <a name="l00706"></a>00706 $tagAttrib[0][$attr] = $params['prefixRelPathWith'].$tagAttrib[0][$attr]; <a name="l00707"></a>00707 } <a name="l00708"></a>00708 } <a name="l00709"></a>00709 <span class="keywordflow">if</span> ($params['userFunc']) { <a name="l00710"></a>00710 $tagAttrib[0][$attr] = <a class="code" href="classt3lib__div.html#1458e987700fb6f722ec5186644f6580">t3lib_div::callUserFunction</a>($params['userFunc'],$tagAttrib[0][$attr],$this); <a name="l00711"></a>00711 } <a name="l00712"></a>00712 } <a name="l00713"></a>00713 } <a name="l00714"></a>00714 $tagParts[1]=$this->compileTagAttribs($tagAttrib[0],$tagAttrib[1]); <a name="l00715"></a>00715 } <a name="l00716"></a>00716 } <span class="keywordflow">else</span> { <span class="comment">// If endTag, remove any possible attributes:</span> <a name="l00717"></a>00717 $tagParts[1]=''; <a name="l00718"></a>00718 } <a name="l00719"></a>00719 <a name="l00720"></a>00720 <span class="comment">// Protecting the tag by converting < and > to &lt; and &gt; ??</span> <a name="l00721"></a>00721 <span class="keywordflow">if</span> ($tags[$tagName]['protect']) { <a name="l00722"></a>00722 $lt = '&lt;'; $gt = '&gt;'; <a name="l00723"></a>00723 } <span class="keywordflow">else</span> { <a name="l00724"></a>00724 $lt = <span class="charliteral">'<'</span>; $gt = <span class="charliteral">'>'</span>; <a name="l00725"></a>00725 } <a name="l00726"></a>00726 <span class="comment">// Remapping tag name?</span> <a name="l00727"></a>00727 <span class="keywordflow">if</span> ($tags[$tagName]['remap']) $tagParts[0] = $tags[$tagName]['remap']; <a name="l00728"></a>00728 <a name="l00729"></a>00729 <span class="comment">// rmTagIfNoAttrib</span> <a name="l00730"></a>00730 <span class="keywordflow">if</span> ($endTag || trim($tagParts[1]) || !$tags[$tagName]['rmTagIfNoAttrib']) { <a name="l00731"></a>00731 $setTag=1; <a name="l00732"></a>00732 <a name="l00733"></a>00733 <span class="keywordflow">if</span> ($tags[$tagName]['nesting']) { <a name="l00734"></a>00734 <span class="keywordflow">if</span> (!is_array($tagRegister[$tagName])) $tagRegister[$tagName]=array(); <a name="l00735"></a>00735 <a name="l00736"></a>00736 <span class="keywordflow">if</span> ($endTag) { <a name="l00737"></a>00737 <span class="comment">/* if ($tags[$tagName]['nesting']=='global') {</span> <a name="l00738"></a>00738 <span class="comment"> $lastEl = end($tagStack);</span> <a name="l00739"></a>00739 <span class="comment"> $correctTag = !strcmp($tagName,$lastEl);</span> <a name="l00740"></a>00740 <span class="comment"> } else $correctTag=1;</span> <a name="l00741"></a>00741 <span class="comment"> */</span> <a name="l00742"></a>00742 $correctTag=1; <a name="l00743"></a>00743 <span class="keywordflow">if</span> ($tags[$tagName]['nesting']=='global') { <a name="l00744"></a>00744 $lastEl = end($tagStack); <a name="l00745"></a>00745 <span class="keywordflow">if</span> (strcmp($tagName,$lastEl)) { <a name="l00746"></a>00746 <span class="keywordflow">if</span> (in_array($tagName,$tagStack)) { <a name="l00747"></a>00747 <span class="keywordflow">while</span>(count($tagStack) && strcmp($tagName,$lastEl)) { <a name="l00748"></a>00748 $elPos = end($tagRegister[$lastEl]); <a name="l00749"></a>00749 unset($newContent[$elPos]); <a name="l00750"></a>00750 <a name="l00751"></a>00751 array_pop($tagRegister[$lastEl]); <a name="l00752"></a>00752 array_pop($tagStack); <a name="l00753"></a>00753 $lastEl = end($tagStack); <a name="l00754"></a>00754 } <a name="l00755"></a>00755 } <span class="keywordflow">else</span> { <a name="l00756"></a>00756 $correctTag=0; <span class="comment">// In this case the</span> <a name="l00757"></a>00757 } <a name="l00758"></a>00758 } <a name="l00759"></a>00759 } <a name="l00760"></a>00760 <span class="keywordflow">if</span> (!count($tagRegister[$tagName]) || !$correctTag) { <a name="l00761"></a>00761 $setTag=0; <a name="l00762"></a>00762 } <span class="keywordflow">else</span> { <a name="l00763"></a>00763 array_pop($tagRegister[$tagName]); <a name="l00764"></a>00764 <span class="keywordflow">if</span> ($tags[$tagName]['nesting']=='global') {array_pop($tagStack);} <a name="l00765"></a>00765 } <a name="l00766"></a>00766 } <span class="keywordflow">else</span> { <a name="l00767"></a>00767 array_push($tagRegister[$tagName],$c); <a name="l00768"></a>00768 <span class="keywordflow">if</span> ($tags[$tagName]['nesting']=='global') {array_push($tagStack,$tagName);} <a name="l00769"></a>00769 } <a name="l00770"></a>00770 } <a name="l00771"></a>00771 <a name="l00772"></a>00772 <span class="keywordflow">if</span> ($setTag) { <a name="l00773"></a>00773 <span class="comment">// Setting the tag</span> <a name="l00774"></a>00774 $newContent[$c++]=$this->processTag($lt.($endTag?<span class="charliteral">'/'</span>:'').trim($tagParts[0].<span class="charliteral">' '</span>.$tagParts[1]).$gt,$addConfig,$endTag,$lt=='&lt;'); <a name="l00775"></a>00775 } <a name="l00776"></a>00776 } <a name="l00777"></a>00777 } <span class="keywordflow">else</span> { <a name="l00778"></a>00778 $newContent[$c++]=$this->processTag(<span class="charliteral">'<'</span>.($endTag?<span class="charliteral">'/'</span>:'').$tagContent.<span class="charliteral">'>'</span>,$addConfig,$endTag); <a name="l00779"></a>00779 } <a name="l00780"></a>00780 } elseif ($keepAll) { <span class="comment">// This is if the tag was not defined in the array for processing:</span> <a name="l00781"></a>00781 <span class="keywordflow">if</span> (!strcmp($keepAll,'protect')) { <a name="l00782"></a>00782 $lt = '&lt;'; $gt = '&gt;'; <a name="l00783"></a>00783 } <span class="keywordflow">else</span> { <a name="l00784"></a>00784 $lt = <span class="charliteral">'<'</span>; $gt = <span class="charliteral">'>'</span>; <a name="l00785"></a>00785 } <a name="l00786"></a>00786 $newContent[$c++]=$this->processTag($lt.($endTag?<span class="charliteral">'/'</span>:'').$tagContent.$gt,$addConfig,$endTag,$lt=='&lt;'); <a name="l00787"></a>00787 } <a name="l00788"></a>00788 $newContent[$c++]=$this->processContent(substr($tok,$tagEnd+1),$hSC,$addConfig); <a name="l00789"></a>00789 } <span class="keywordflow">else</span> { <a name="l00790"></a>00790 $newContent[$c++]=$this->processContent(<span class="charliteral">'<'</span>.$tok,$hSC,$addConfig); <span class="comment">// There were not end-bracket, so no tag...</span> <a name="l00791"></a>00791 } <a name="l00792"></a>00792 } <span class="keywordflow">else</span> { <a name="l00793"></a>00793 $newContent[$c++]=$this->processContent(<span class="charliteral">'<'</span>.$tok,$hSC,$addConfig); <span class="comment">// It was not a tag anyways</span> <a name="l00794"></a>00794 } <a name="l00795"></a>00795 } <a name="l00796"></a>00796 <a name="l00797"></a>00797 <span class="comment">// Unsetting tags:</span> <a name="l00798"></a>00798 foreach ($tagRegister as $tag => $positions) { <a name="l00799"></a>00799 foreach ($positions as $pKey) { <a name="l00800"></a>00800 unset($newContent[$pKey]); <a name="l00801"></a>00801 } <a name="l00802"></a>00802 } <a name="l00803"></a>00803 <a name="l00804"></a>00804 <span class="keywordflow">return</span> implode('',$newContent); <a name="l00805"></a>00805 } <a name="l00806"></a>00806 <a name="l00814"></a>00814 function bidir_htmlspecialchars($value,$dir) { <a name="l00815"></a>00815 <span class="keywordflow">if</span> ($dir==1) { <a name="l00816"></a>00816 $value = htmlspecialchars($value); <a name="l00817"></a>00817 } elseif ($dir==2) { <a name="l00818"></a>00818 $value = <a class="code" href="classt3lib__div.html#6f22285e9535ceb6f91b8d528e2a2d09">t3lib_div::deHSCentities</a>(htmlspecialchars($value)); <a name="l00819"></a>00819 } elseif ($dir==-1) { <a name="l00820"></a>00820 $value = str_replace('&gt;<span class="charliteral">','</span>>',$value); <a name="l00821"></a>00821 $value = str_replace('&lt;<span class="charliteral">','</span><',$value); <a name="l00822"></a>00822 $value = str_replace('&quot;<span class="charliteral">','</span><span class="stringliteral">"',$value);</span> <a name="l00823"></a>00823 <span class="stringliteral"> $value = str_replace('&amp;','&',$value);</span> <a name="l00824"></a>00824 <span class="stringliteral"> }</span> <a name="l00825"></a>00825 <span class="stringliteral"> return $value;</span> <a name="l00826"></a>00826 <span class="stringliteral"> }</span> <a name="l00827"></a>00827 <span class="stringliteral"></span> <a name="l00837"></a>00837 <span class="stringliteral"> function prefixResourcePath($main_prefix,$content,$alternatives=array(),$suffix='') {</span> <a name="l00838"></a>00838 <span class="stringliteral"></span> <a name="l00839"></a>00839 <span class="stringliteral"> $parts = $this->splitTags('embed,td,table,body,img,input,form,link,script,a',$content);</span> <a name="l00840"></a>00840 <span class="stringliteral"> foreach ($parts as $k => $v) {</span> <a name="l00841"></a>00841 <span class="stringliteral"> if ($k%2) {</span> <a name="l00842"></a>00842 <span class="stringliteral"> $params = $this->get_tag_attributes($v,1);</span> <a name="l00843"></a>00843 <span class="stringliteral"> $tagEnd = substr($v,-2)=='/>' ? ' />' : '>'; // Detect tag-ending so that it is re-applied correctly.</span> <a name="l00844"></a>00844 <span class="stringliteral"> $firstTagName = $this->getFirstTagName($v); // The 'name' of the first tag</span> <a name="l00845"></a>00845 <span class="stringliteral"> $somethingDone=0;</span> <a name="l00846"></a>00846 <span class="stringliteral"> $prefix = isset($alternatives[strtoupper($firstTagName)]) ? $alternatives[strtoupper($firstTagName)] : $main_prefix;</span> <a name="l00847"></a>00847 <span class="stringliteral"> switch(strtolower($firstTagName)) {</span> <a name="l00848"></a>00848 <span class="stringliteral"> // background - attribute:</span> <a name="l00849"></a>00849 <span class="stringliteral"> case 'td':</span> <a name="l00850"></a>00850 <span class="stringliteral"> case 'body':</span> <a name="l00851"></a>00851 <span class="stringliteral"> case 'table':</span> <a name="l00852"></a>00852 <span class="stringliteral"> $src = $params[0]['background'];</span> <a name="l00853"></a>00853 <span class="stringliteral"> if ($src) {</span> <a name="l00854"></a>00854 <span class="stringliteral"> $params[0]['background'] = $this->prefixRelPath($prefix,$params[0]['background'],$suffix);</span> <a name="l00855"></a>00855 <span class="stringliteral"> $somethingDone=1;</span> <a name="l00856"></a>00856 <span class="stringliteral"> }</span> <a name="l00857"></a>00857 <span class="stringliteral"> break;</span> <a name="l00858"></a>00858 <span class="stringliteral"> // src attribute</span> <a name="l00859"></a>00859 <span class="stringliteral"> case 'img':</span> <a name="l00860"></a>00860 <span class="stringliteral"> case 'input':</span> <a name="l00861"></a>00861 <span class="stringliteral"> case 'script':</span> <a name="l00862"></a>00862 <span class="stringliteral"> case 'embed':</span> <a name="l00863"></a>00863 <span class="stringliteral"> $src = $params[0]['src'];</span> <a name="l00864"></a>00864 <span class="stringliteral"> if ($src) {</span> <a name="l00865"></a>00865 <span class="stringliteral"> $params[0]['src'] = $this->prefixRelPath($prefix,$params[0]['src'],$suffix);</span> <a name="l00866"></a>00866 <span class="stringliteral"> $somethingDone=1;</span> <a name="l00867"></a>00867 <span class="stringliteral"> }</span> <a name="l00868"></a>00868 <span class="stringliteral"> break;</span> <a name="l00869"></a>00869 <span class="stringliteral"> case 'link':</span> <a name="l00870"></a>00870 <span class="stringliteral"> case 'a':</span> <a name="l00871"></a>00871 <span class="stringliteral"> $src = $params[0]['href'];</span> <a name="l00872"></a>00872 <span class="stringliteral"> if ($src) {</span> <a name="l00873"></a>00873 <span class="stringliteral"> $params[0]['href'] = $this->prefixRelPath($prefix,$params[0]['href'],$suffix);</span> <a name="l00874"></a>00874 <span class="stringliteral"> $somethingDone=1;</span> <a name="l00875"></a>00875 <span class="stringliteral"> }</span> <a name="l00876"></a>00876 <span class="stringliteral"> break;</span> <a name="l00877"></a>00877 <span class="stringliteral"> // action attribute</span> <a name="l00878"></a>00878 <span class="stringliteral"> case 'form':</span> <a name="l00879"></a>00879 <span class="stringliteral"> $src = $params[0]['action'];</span> <a name="l00880"></a>00880 <span class="stringliteral"> if ($src) {</span> <a name="l00881"></a>00881 <span class="stringliteral"> $params[0]['action'] = $this->prefixRelPath($prefix,$params[0]['action'],$suffix);</span> <a name="l00882"></a>00882 <span class="stringliteral"> $somethingDone=1;</span> <a name="l00883"></a>00883 <span class="stringliteral"> }</span> <a name="l00884"></a>00884 <span class="stringliteral"> break;</span> <a name="l00885"></a>00885 <span class="stringliteral"> }</span> <a name="l00886"></a>00886 <span class="stringliteral"> if ($somethingDone) {</span> <a name="l00887"></a>00887 <span class="stringliteral"> $tagParts = preg_split('/\s+/s',$v,2);</span> <a name="l00888"></a>00888 <span class="stringliteral"> $tagParts[1]=$this->compileTagAttribs($params[0],$params[1]);</span> <a name="l00889"></a>00889 <span class="stringliteral"> $parts[$k] = '<'.trim(strtolower($firstTagName).' '.$tagParts[1]).$tagEnd;</span> <a name="l00890"></a>00890 <span class="stringliteral"> }</span> <a name="l00891"></a>00891 <span class="stringliteral"> }</span> <a name="l00892"></a>00892 <span class="stringliteral"> }</span> <a name="l00893"></a>00893 <span class="stringliteral"> $content = implode('',$parts);</span> <a name="l00894"></a>00894 <span class="stringliteral"></span> <a name="l00895"></a>00895 <span class="stringliteral"> // Fix <style> section:</span> <a name="l00896"></a>00896 <span class="stringliteral"> $prefix = isset($alternatives['style']) ? $alternatives['style'] : $main_prefix;</span> <a name="l00897"></a>00897 <span class="stringliteral"> if (strlen($prefix)) {</span> <a name="l00898"></a>00898 <span class="stringliteral"> $parts = $this->splitIntoBlock('style',$content);</span> <a name="l00899"></a>00899 <span class="stringliteral"> foreach($parts as $k => $v) {</span> <a name="l00900"></a>00900 <span class="stringliteral"> if ($k%2) {</span> <a name="l00901"></a>00901 <span class="stringliteral"> $parts[$k] = eregi_replace('(url[[:space:]]*\([[:space:]]*["</span>\']?)([^<span class="stringliteral">"\')]*)(["</span>\']?[[:space:]]*\))<span class="charliteral">','</span>\1'.$prefix.<span class="charliteral">'\2'</span>.$suffix.<span class="charliteral">'\3'</span>,$parts[$k]); <a name="l00902"></a>00902 } <a name="l00903"></a>00903 } <a name="l00904"></a>00904 $content = implode('',$parts); <a name="l00905"></a>00905 } <a name="l00906"></a>00906 <a name="l00907"></a>00907 <span class="keywordflow">return</span> $content; <a name="l00908"></a>00908 } <a name="l00909"></a>00909 <a name="l00919"></a>00919 function prefixRelPath($prefix,$srcVal,$suffix='') { <a name="l00920"></a>00920 $pU = parse_url($srcVal); <a name="l00921"></a>00921 <span class="keywordflow">if</span> (!$pU['scheme'] && substr($srcVal, 0, 1)!=<span class="charliteral">'/'</span>) { <span class="comment">// If not an absolute URL.</span> <a name="l00922"></a>00922 $srcVal = $prefix.$srcVal.$suffix; <a name="l00923"></a>00923 } <a name="l00924"></a>00924 <span class="keywordflow">return</span> $srcVal; <a name="l00925"></a>00925 } <a name="l00926"></a>00926 <a name="l00937"></a>00937 function cleanFontTags($value,$keepFace=0,$keepSize=0,$keepColor=0) { <a name="l00938"></a>00938 $fontSplit = $this->splitIntoBlock('font',$value); <span class="comment">// ,1 ?? - could probably be more stable if splitTags() was used since this depends on end-tags being properly set!</span> <a name="l00939"></a>00939 foreach ($fontSplit as $k => $v) { <a name="l00940"></a>00940 <span class="keywordflow">if</span> ($k%2) { <span class="comment">// font:</span> <a name="l00941"></a>00941 $attribArray=$this->get_tag_attributes_classic($this->getFirstTag($v)); <a name="l00942"></a>00942 $newAttribs=array(); <a name="l00943"></a>00943 <span class="keywordflow">if</span> ($keepFace && $attribArray['face']) $newAttribs[]='face=<span class="stringliteral">"'.$attribArray['face'].'"</span>'; <a name="l00944"></a>00944 <span class="keywordflow">if</span> ($keepSize && $attribArray['size']) $newAttribs[]='size=<span class="stringliteral">"'.$attribArray['size'].'"</span>'; <a name="l00945"></a>00945 <span class="keywordflow">if</span> ($keepColor && $attribArray['color']) $newAttribs[]='color=<span class="stringliteral">"'.$attribArray['color'].'"</span>'; <a name="l00946"></a>00946 <a name="l00947"></a>00947 $innerContent = $this->cleanFontTags($this->removeFirstAndLastTag($v),$keepFace,$keepSize,$keepColor); <a name="l00948"></a>00948 <span class="keywordflow">if</span> (count($newAttribs)) { <a name="l00949"></a>00949 $fontSplit[$k]='<font '.implode(<span class="charliteral">' '</span>,$newAttribs).<span class="charliteral">'>'</span>.$innerContent.'</font>'; <a name="l00950"></a>00950 } <span class="keywordflow">else</span> { <a name="l00951"></a>00951 $fontSplit[$k]=$innerContent; <a name="l00952"></a>00952 } <a name="l00953"></a>00953 } <a name="l00954"></a>00954 } <a name="l00955"></a>00955 <span class="keywordflow">return</span> implode('',$fontSplit); <a name="l00956"></a>00956 } <a name="l00957"></a>00957 <a name="l00967"></a>00967 function mapTags($value,$tags=array(),$ltChar=<span class="charliteral">'<'</span>,$ltChar2=<span class="charliteral">'<'</span>) { <a name="l00968"></a>00968 <a name="l00969"></a>00969 foreach($tags as $from => $to) { <a name="l00970"></a>00970 $value = preg_replace(<span class="charliteral">'/'</span>.preg_quote($ltChar).'(\/)?'.$from.'\s([^\>])*(\/)?\>/', $ltChar2.'$1'.$to.' $2$3>', $value); <a name="l00971"></a>00971 } <a name="l00972"></a>00972 <span class="keywordflow">return</span> $value; <a name="l00973"></a>00973 } <a name="l00974"></a>00974 <a name="l00982"></a>00982 function unprotectTags($content,$tagList='') { <a name="l00983"></a>00983 $tagsArray = <a class="code" href="classt3lib__div.html#cfb87d585b85e9b32841bde40beaa96c">t3lib_div::trimExplode</a>(<span class="charliteral">','</span>,$tagList,1); <a name="l00984"></a>00984 $contentParts = explode('&lt;',$content); <a name="l00985"></a>00985 next($contentParts); <span class="comment">// bypass the first</span> <a name="l00986"></a>00986 <span class="keywordflow">while</span>(list($k,$tok)=each($contentParts)) { <a name="l00987"></a>00987 $firstChar = substr($tok,0,1); <a name="l00988"></a>00988 <span class="keywordflow">if</span> (strcmp(trim($firstChar),'')) { <a name="l00989"></a>00989 $subparts = explode('&gt;',$tok,2); <a name="l00990"></a>00990 $tagEnd = strlen($subparts[0]); <a name="l00991"></a>00991 <span class="keywordflow">if</span> (strlen($tok)!=$tagEnd) { <a name="l00992"></a>00992 $endTag = $firstChar==<span class="charliteral">'/'</span> ? 1 : 0; <a name="l00993"></a>00993 $tagContent = substr($tok,$endTag,$tagEnd-$endTag); <a name="l00994"></a>00994 $tagParts = preg_split('/\s+/s',$tagContent,2); <a name="l00995"></a>00995 $tagName = strtolower($tagParts[0]); <a name="l00996"></a>00996 <span class="keywordflow">if</span> (!strcmp($tagList,'') || in_array($tagName,$tagsArray)) { <a name="l00997"></a>00997 $contentParts[$k] = <span class="charliteral">'<'</span>.$subparts[0].<span class="charliteral">'>'</span>.$subparts[1]; <a name="l00998"></a>00998 } <span class="keywordflow">else</span> $contentParts[$k] = '&lt;'.$tok; <a name="l00999"></a>00999 } <span class="keywordflow">else</span> $contentParts[$k] = '&lt;'.$tok; <a name="l01000"></a>01000 } <span class="keywordflow">else</span> $contentParts[$k] = '&lt;'.$tok; <a name="l01001"></a>01001 } <a name="l01002"></a>01002 <a name="l01003"></a>01003 <span class="keywordflow">return</span> implode('',$contentParts); <a name="l01004"></a>01004 } <a name="l01005"></a>01005 <a name="l01015"></a>01015 function stripTagsExcept($value,$tagList) { <a name="l01016"></a>01016 $tags=<a class="code" href="classt3lib__div.html#cfb87d585b85e9b32841bde40beaa96c">t3lib_div::trimExplode</a>(<span class="charliteral">','</span>,$tagList,1); <a name="l01017"></a>01017 $forthArr=array(); <a name="l01018"></a>01018 $backArr=array(); <a name="l01019"></a>01019 foreach ($tags as $theTag) { <a name="l01020"></a>01020 $forthArr[$theTag]=md5($theTag); <a name="l01021"></a>01021 $backArr[md5($theTag)]=$theTag; <a name="l01022"></a>01022 } <a name="l01023"></a>01023 $value = $this->mapTags($value,$forthArr,<span class="charliteral">'<'</span>,<span class="charliteral">'_'</span>); <a name="l01024"></a>01024 $value=strip_tags($value); <a name="l01025"></a>01025 $value = $this->mapTags($value,$backArr,<span class="charliteral">'_'</span>,<span class="charliteral">'<'</span>); <a name="l01026"></a>01026 <span class="keywordflow">return</span> $value; <a name="l01027"></a>01027 } <a name="l01028"></a>01028 <a name="l01038"></a>01038 function caseShift($str,$flag,$cacheKey='') { <a name="l01039"></a>01039 $cacheKey .= $flag?1:0; <a name="l01040"></a>01040 <span class="keywordflow">if</span> (is_array($str)) { <a name="l01041"></a>01041 <span class="keywordflow">if</span> (!$cacheKey || !isset($this->caseShift_cache[$cacheKey])) { <a name="l01042"></a>01042 reset($str); <a name="l01043"></a>01043 foreach ($str as $k => $v) { <a name="l01044"></a>01044 <span class="keywordflow">if</span> (!$flag) { <a name="l01045"></a>01045 $str[$k] = strtoupper($v); <a name="l01046"></a>01046 } <a name="l01047"></a>01047 } <a name="l01048"></a>01048 <span class="keywordflow">if</span> ($cacheKey) $this->caseShift_cache[$cacheKey]=$str; <a name="l01049"></a>01049 } <span class="keywordflow">else</span> { <a name="l01050"></a>01050 $str = $this->caseShift_cache[$cacheKey]; <a name="l01051"></a>01051 } <a name="l01052"></a>01052 } elseif (!$flag) { $str = strtoupper($str); } <a name="l01053"></a>01053 <span class="keywordflow">return</span> $str; <a name="l01054"></a>01054 } <a name="l01055"></a>01055 <a name="l01065"></a>01065 function compileTagAttribs($tagAttrib,$meta=array(), $xhtmlClean=0) { <a name="l01066"></a>01066 $accu=array(); <a name="l01067"></a>01067 foreach ($tagAttrib as $k =>$v) { <a name="l01068"></a>01068 <span class="keywordflow">if</span> ($xhtmlClean) { <a name="l01069"></a>01069 $attr=strtolower($k); <a name="l01070"></a>01070 <span class="keywordflow">if</span> (strcmp($v,'') || isset($meta[$k]['dashType'])) { <a name="l01071"></a>01071 $attr.='=<span class="stringliteral">"'.htmlspecialchars($v).'"</span>'; <a name="l01072"></a>01072 } <a name="l01073"></a>01073 } <span class="keywordflow">else</span> { <a name="l01074"></a>01074 $attr=$meta[$k]['origTag']?$meta[$k]['origTag']:$k; <a name="l01075"></a>01075 <span class="keywordflow">if</span> (strcmp($v,'') || isset($meta[$k]['dashType'])) { <a name="l01076"></a>01076 $dash=$meta[$k]['dashType']?$meta[$k]['dashType']:(<a class="code" href="classt3lib__div.html#66f511b7e73eb4721804108f79e45fcb">t3lib_div::testInt</a>($v)?'<span class="charliteral">':'</span><span class="stringliteral">"');</span> <a name="l01077"></a>01077 <span class="stringliteral"> $attr.='='.$dash.$v.$dash;</span> <a name="l01078"></a>01078 <span class="stringliteral"> }</span> <a name="l01079"></a>01079 <span class="stringliteral"> }</span> <a name="l01080"></a>01080 <span class="stringliteral"> $accu[]=$attr;</span> <a name="l01081"></a>01081 <span class="stringliteral"> }</span> <a name="l01082"></a>01082 <span class="stringliteral"> return implode(' ',$accu);</span> <a name="l01083"></a>01083 <span class="stringliteral"> }</span> <a name="l01084"></a>01084 <span class="stringliteral"></span> <a name="l01093"></a>01093 <span class="stringliteral"> function get_tag_attributes_classic($tag,$deHSC=0) {</span> <a name="l01094"></a>01094 <span class="stringliteral"> $attr=$this->get_tag_attributes($tag,$deHSC);</span> <a name="l01095"></a>01095 <span class="stringliteral"> return is_array($attr[0])?$attr[0]:array();</span> <a name="l01096"></a>01096 <span class="stringliteral"> }</span> <a name="l01097"></a>01097 <span class="stringliteral"></span> <a name="l01106"></a>01106 <span class="stringliteral"> function indentLines($content, $number=1, $indentChar="</span>\t<span class="stringliteral">") {</span> <a name="l01107"></a>01107 <span class="stringliteral"> $preTab = str_pad('', $number*strlen($indentChar), $indentChar);</span> <a name="l01108"></a>01108 <span class="stringliteral"> $lines = explode(chr(10),str_replace(chr(13),'',$content));</span> <a name="l01109"></a>01109 <span class="stringliteral"> foreach ($lines as $k => $v) {</span> <a name="l01110"></a>01110 <span class="stringliteral"> $lines[$k] = $preTab.$v;</span> <a name="l01111"></a>01111 <span class="stringliteral"> }</span> <a name="l01112"></a>01112 <span class="stringliteral"> return implode(chr(10), $lines);</span> <a name="l01113"></a>01113 <span class="stringliteral"> }</span> <a name="l01114"></a>01114 <span class="stringliteral"></span> <a name="l01123"></a>01123 <span class="stringliteral"> function HTMLparserConfig($TSconfig,$keepTags=array()) {</span> <a name="l01124"></a>01124 <span class="stringliteral"> // Allow tags (base list, merged with incoming array)</span> <a name="l01125"></a>01125 <span class="stringliteral"> $alTags = array_flip(t3lib_div::trimExplode(',',strtolower($TSconfig['allowTags']),1));</span> <a name="l01126"></a>01126 <span class="stringliteral"> $keepTags = array_merge($alTags,$keepTags);</span> <a name="l01127"></a>01127 <span class="stringliteral"></span> <a name="l01128"></a>01128 <span class="stringliteral"> // Set config properties.</span> <a name="l01129"></a>01129 <span class="stringliteral"> if (is_array($TSconfig['tags.'])) {</span> <a name="l01130"></a>01130 <span class="stringliteral"> reset($TSconfig['tags.']);</span> <a name="l01131"></a>01131 <span class="stringliteral"> while(list($key,$tagC)=each($TSconfig['tags.'])) {</span> <a name="l01132"></a>01132 <span class="stringliteral"> if (!is_array($tagC) && $key==strtolower($key)) {</span> <a name="l01133"></a>01133 <span class="stringliteral"> if (!strcmp($tagC,'0')) unset($keepTags[$key]);</span> <a name="l01134"></a>01134 <span class="stringliteral"> if (!strcmp($tagC,'1') && !isset($keepTags[$key])) $keepTags[$key]=1;</span> <a name="l01135"></a>01135 <span class="stringliteral"> }</span> <a name="l01136"></a>01136 <span class="stringliteral"> }</span> <a name="l01137"></a>01137 <span class="stringliteral"></span> <a name="l01138"></a>01138 <span class="stringliteral"> reset($TSconfig['tags.']);</span> <a name="l01139"></a>01139 <span class="stringliteral"> foreach ($TSconfig['tags.'] as $key => $tagC) {</span> <a name="l01140"></a>01140 <span class="stringliteral"> if (is_array($tagC) && $key==strtolower($key)) {</span> <a name="l01141"></a>01141 <span class="stringliteral"> $key=substr($key,0,-1);</span> <a name="l01142"></a>01142 <span class="stringliteral"> if (!is_array($keepTags[$key])) $keepTags[$key]=array();</span> <a name="l01143"></a>01143 <span class="stringliteral"> if (is_array($tagC['fixAttrib.'])) {</span> <a name="l01144"></a>01144 <span class="stringliteral"> reset($tagC['fixAttrib.']);</span> <a name="l01145"></a>01145 <span class="stringliteral"> while(list($atName,$atConfig)=each($tagC['fixAttrib.'])) {</span> <a name="l01146"></a>01146 <span class="stringliteral"> if (is_array($atConfig)) {</span> <a name="l01147"></a>01147 <span class="stringliteral"> $atName=substr($atName,0,-1);</span> <a name="l01148"></a>01148 <span class="stringliteral"> if (!is_array($keepTags[$key]['fixAttrib'][$atName])) {</span> <a name="l01149"></a>01149 <span class="stringliteral"> $keepTags[$key]['fixAttrib'][$atName]=array();</span> <a name="l01150"></a>01150 <span class="stringliteral"> }</span> <a name="l01151"></a>01151 <span class="stringliteral"> $keepTags[$key]['fixAttrib'][$atName] = array_merge($keepTags[$key]['fixAttrib'][$atName],$atConfig); // Candidate for t3lib_div::array_merge() if integer-keys will some day make trouble...</span> <a name="l01152"></a>01152 <span class="stringliteral"> if (strcmp($keepTags[$key]['fixAttrib'][$atName]['range'],'')) $keepTags[$key]['fixAttrib'][$atName]['range'] = t3lib_div::trimExplode(',',$keepTags[$key]['fixAttrib'][$atName]['range']);</span> <a name="l01153"></a>01153 <span class="stringliteral"> if (strcmp($keepTags[$key]['fixAttrib'][$atName]['list'],'')) $keepTags[$key]['fixAttrib'][$atName]['list'] = t3lib_div::trimExplode(',',$keepTags[$key]['fixAttrib'][$atName]['list']);</span> <a name="l01154"></a>01154 <span class="stringliteral"> }</span> <a name="l01155"></a>01155 <span class="stringliteral"> }</span> <a name="l01156"></a>01156 <span class="stringliteral"> }</span> <a name="l01157"></a>01157 <span class="stringliteral"> unset($tagC['fixAttrib.']);</span> <a name="l01158"></a>01158 <span class="stringliteral"> unset($tagC['fixAttrib']);</span> <a name="l01159"></a>01159 <span class="stringliteral"> $keepTags[$key] = array_merge($keepTags[$key],$tagC); // Candidate for t3lib_div::array_merge() if integer-keys will some day make trouble...</span> <a name="l01160"></a>01160 <span class="stringliteral"> }</span> <a name="l01161"></a>01161 <span class="stringliteral"> }</span> <a name="l01162"></a>01162 <span class="stringliteral"> }</span> <a name="l01163"></a>01163 <span class="stringliteral"> // localNesting</span> <a name="l01164"></a>01164 <span class="stringliteral"> if ($TSconfig['localNesting']) {</span> <a name="l01165"></a>01165 <span class="stringliteral"> $lN = t3lib_div::trimExplode(',',strtolower($TSconfig['localNesting']),1);</span> <a name="l01166"></a>01166 <span class="stringliteral"> while(list(,$tn)=each($lN)) {</span> <a name="l01167"></a>01167 <span class="stringliteral"> if (isset($keepTags[$tn])) {</span> <a name="l01168"></a>01168 <span class="stringliteral"> $keepTags[$tn]['nesting']=1;</span> <a name="l01169"></a>01169 <span class="stringliteral"> }</span> <a name="l01170"></a>01170 <span class="stringliteral"> }</span> <a name="l01171"></a>01171 <span class="stringliteral"> }</span> <a name="l01172"></a>01172 <span class="stringliteral"> if ($TSconfig['globalNesting']) {</span> <a name="l01173"></a>01173 <span class="stringliteral"> $lN = t3lib_div::trimExplode(',',strtolower($TSconfig['globalNesting']),1);</span> <a name="l01174"></a>01174 <span class="stringliteral"> while(list(,$tn)=each($lN)) {</span> <a name="l01175"></a>01175 <span class="stringliteral"> if (isset($keepTags[$tn])) {</span> <a name="l01176"></a>01176 <span class="stringliteral"> if (!is_array($keepTags[$tn])) $keepTags[$tn]=array();</span> <a name="l01177"></a>01177 <span class="stringliteral"> $keepTags[$tn]['nesting']='global';</span> <a name="l01178"></a>01178 <span class="stringliteral"> }</span> <a name="l01179"></a>01179 <span class="stringliteral"> }</span> <a name="l01180"></a>01180 <span class="stringliteral"> }</span> <a name="l01181"></a>01181 <span class="stringliteral"> if ($TSconfig['rmTagIfNoAttrib']) {</span> <a name="l01182"></a>01182 <span class="stringliteral"> $lN = t3lib_div::trimExplode(',',strtolower($TSconfig['rmTagIfNoAttrib']),1);</span> <a name="l01183"></a>01183 <span class="stringliteral"> while(list(,$tn)=each($lN)) {</span> <a name="l01184"></a>01184 <span class="stringliteral"> if (isset($keepTags[$tn])) {</span> <a name="l01185"></a>01185 <span class="stringliteral"> if (!is_array($keepTags[$tn])) $keepTags[$tn]=array();</span> <a name="l01186"></a>01186 <span class="stringliteral"> $keepTags[$tn]['rmTagIfNoAttrib']=1;</span> <a name="l01187"></a>01187 <span class="stringliteral"> }</span> <a name="l01188"></a>01188 <span class="stringliteral"> }</span> <a name="l01189"></a>01189 <span class="stringliteral"> }</span> <a name="l01190"></a>01190 <span class="stringliteral"> if ($TSconfig['noAttrib']) {</span> <a name="l01191"></a>01191 <span class="stringliteral"> $lN = t3lib_div::trimExplode(',',strtolower($TSconfig['noAttrib']),1);</span> <a name="l01192"></a>01192 <span class="stringliteral"> while(list(,$tn)=each($lN)) {</span> <a name="l01193"></a>01193 <span class="stringliteral"> if (isset($keepTags[$tn])) {</span> <a name="l01194"></a>01194 <span class="stringliteral"> if (!is_array($keepTags[$tn])) $keepTags[$tn]=array();</span> <a name="l01195"></a>01195 <span class="stringliteral"> $keepTags[$tn]['allowedAttribs']=0;</span> <a name="l01196"></a>01196 <span class="stringliteral"> }</span> <a name="l01197"></a>01197 <span class="stringliteral"> }</span> <a name="l01198"></a>01198 <span class="stringliteral"> }</span> <a name="l01199"></a>01199 <span class="stringliteral"> if ($TSconfig['removeTags']) {</span> <a name="l01200"></a>01200 <span class="stringliteral"> $lN = t3lib_div::trimExplode(',',strtolower($TSconfig['removeTags']),1);</span> <a name="l01201"></a>01201 <span class="stringliteral"> while(list(,$tn)=each($lN)) {</span> <a name="l01202"></a>01202 <span class="stringliteral"> $keepTags[$tn]=array();</span> <a name="l01203"></a>01203 <span class="stringliteral"> $keepTags[$tn]['allowedAttribs']=0;</span> <a name="l01204"></a>01204 <span class="stringliteral"> $keepTags[$tn]['rmTagIfNoAttrib']=1;</span> <a name="l01205"></a>01205 <span class="stringliteral"> }</span> <a name="l01206"></a>01206 <span class="stringliteral"> }</span> <a name="l01207"></a>01207 <span class="stringliteral"></span> <a name="l01208"></a>01208 <span class="stringliteral"> // Create additional configuration:</span> <a name="l01209"></a>01209 <span class="stringliteral"> $addConfig=array();</span> <a name="l01210"></a>01210 <span class="stringliteral"> if ($TSconfig['xhtml_cleaning']) {</span> <a name="l01211"></a>01211 <span class="stringliteral"> $addConfig['xhtml']=1;</span> <a name="l01212"></a>01212 <span class="stringliteral"> }</span> <a name="l01213"></a>01213 <span class="stringliteral"></span> <a name="l01214"></a>01214 <span class="stringliteral"> return array(</span> <a name="l01215"></a>01215 <span class="stringliteral"> $keepTags,</span> <a name="l01216"></a>01216 <span class="stringliteral"> ''.$TSconfig['keepNonMatchedTags'],</span> <a name="l01217"></a>01217 <span class="stringliteral"> intval($TSconfig['htmlSpecialChars']),</span> <a name="l01218"></a>01218 <span class="stringliteral"> $addConfig</span> <a name="l01219"></a>01219 <span class="stringliteral"> );</span> <a name="l01220"></a>01220 <span class="stringliteral"> }</span> <a name="l01221"></a>01221 <span class="stringliteral"></span> <a name="l01247"></a>01247 <span class="stringliteral"> function XHTML_clean($content) {</span> <a name="l01248"></a>01248 <span class="stringliteral"> $content = $this->HTMLcleaner(</span> <a name="l01249"></a>01249 <span class="stringliteral"> $content,</span> <a name="l01250"></a>01250 <span class="stringliteral"> array(), // No tags treated specially</span> <a name="l01251"></a>01251 <span class="stringliteral"> 1, // Keep ALL tags.</span> <a name="l01252"></a>01252 <span class="stringliteral"> 0, // All content is htmlspecialchar()'ed (or ??) - if we do, <script> content will break...</span> <a name="l01253"></a>01253 <span class="stringliteral"> array('xhtml' => 1)</span> <a name="l01254"></a>01254 <span class="stringliteral"> );</span> <a name="l01255"></a>01255 <span class="stringliteral"> return $content;</span> <a name="l01256"></a>01256 <span class="stringliteral"> }</span> <a name="l01257"></a>01257 <span class="stringliteral"></span> <a name="l01269"></a>01269 <span class="stringliteral"> function processTag($value,$conf,$endTag,$protected=0) {</span> <a name="l01270"></a>01270 <span class="stringliteral"> // Return immediately if protected or no parameters</span> <a name="l01271"></a>01271 <span class="stringliteral"> if ($protected || !count($conf)) return $value;</span> <a name="l01272"></a>01272 <span class="stringliteral"> // OK then, begin processing for XHTML output:</span> <a name="l01273"></a>01273 <span class="stringliteral"> // STILL VERY EXPERIMENTAL!!</span> <a name="l01274"></a>01274 <span class="stringliteral"> if ($conf['xhtml']) {</span> <a name="l01275"></a>01275 <span class="stringliteral"> if ($endTag) { // Endtags are just set lowercase right away</span> <a name="l01276"></a>01276 <span class="stringliteral"> $value = strtolower($value);</span> <a name="l01277"></a>01277 <span class="stringliteral"> } elseif (substr($value,0,4)!='<!--') { // ... and comments are ignored.</span> <a name="l01278"></a>01278 <span class="stringliteral"> $inValue = substr($value,1,(substr($value,-2)=='/>'?-2:-1)); // Finding inner value with out < ></span> <a name="l01279"></a>01279 <span class="stringliteral"> list($tagName,$tagP)=preg_split('/\s+/s',$inValue,2); // Separate attributes and tagname</span> <a name="l01280"></a>01280 <span class="stringliteral"> $tagName = strtolower($tagName);</span> <a name="l01281"></a>01281 <span class="stringliteral"></span> <a name="l01282"></a>01282 <span class="stringliteral"> // Process attributes</span> <a name="l01283"></a>01283 <span class="stringliteral"> $tagAttrib = $this->get_tag_attributes($tagP);</span> <a name="l01284"></a>01284 <span class="stringliteral"> if (!strcmp($tagName,'img') && !isset($tagAttrib[0]['alt'])) $tagAttrib[0]['alt']=''; // Set alt attribute for all images (not XHTML though...)</span> <a name="l01285"></a>01285 <span class="stringliteral"> if (!strcmp($tagName,'script') && !isset($tagAttrib[0]['type'])) $tagAttrib[0]['type']='text/javascript'; // Set type attribute for all script-tags</span> <a name="l01286"></a>01286 <span class="stringliteral"> $outA=array();</span> <a name="l01287"></a>01287 <span class="stringliteral"> reset($tagAttrib[0]);</span> <a name="l01288"></a>01288 <span class="stringliteral"> while(list($attrib_name,$attrib_value)=each($tagAttrib[0])) {</span> <a name="l01289"></a>01289 <span class="stringliteral"> // Set attributes: lowercase, always in quotes, with htmlspecialchars converted.</span> <a name="l01290"></a>01290 <span class="stringliteral"> $outA[]=$attrib_name.'="</span>'.$this->bidir_htmlspecialchars($attrib_value,2).<span class="charliteral">'"'</span>; <a name="l01291"></a>01291 } <a name="l01292"></a>01292 $newTag=<span class="charliteral">'<'</span>.trim($tagName.<span class="charliteral">' '</span>.implode(<span class="charliteral">' '</span>,$outA)); <a name="l01293"></a>01293 <span class="comment">// All tags that are standalone (not wrapping, not having endtags) should be ended with '/>'</span> <a name="l01294"></a>01294 <span class="keywordflow">if</span> (<a class="code" href="classt3lib__div.html#d994a5608365c288d051d6022d4e9976">t3lib_div::inList</a>('img,br,hr,meta,link,base,area,input,param,col',$tagName) || substr($value,-2)=='/>') { <a name="l01295"></a>01295 $newTag.=' />'; <a name="l01296"></a>01296 } <span class="keywordflow">else</span> { <a name="l01297"></a>01297 $newTag.=<span class="charliteral">'>'</span>; <a name="l01298"></a>01298 } <a name="l01299"></a>01299 $value = $newTag; <a name="l01300"></a>01300 } <a name="l01301"></a>01301 } <a name="l01302"></a>01302 <a name="l01303"></a>01303 <span class="keywordflow">return</span> $value; <a name="l01304"></a>01304 } <a name="l01305"></a>01305 <a name="l01315"></a>01315 function processContent($value,$dir,$conf) { <a name="l01316"></a>01316 <span class="keywordflow">if</span> ($dir!=0) $value = $this->bidir_htmlspecialchars($value,$dir); <a name="l01317"></a>01317 <span class="keywordflow">return</span> $value; <a name="l01318"></a>01318 } <a name="l01319"></a>01319 } <a name="l01320"></a>01320 <a name="l01321"></a>01321 <a name="l01322"></a>01322 <a name="l01323"></a>01323 <span class="keywordflow">if</span> (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/<span class="keyword">class</span>.<a class="code" href="classt3lib__parsehtml.html">t3lib_parsehtml</a>.php']) { <a name="l01324"></a>01324 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/<span class="keyword">class</span>.<a class="code" href="classt3lib__parsehtml.html">t3lib_parsehtml</a>.php']); <a name="l01325"></a>01325 } <a name="l01326"></a>01326 ?> </pre></div><?php include_once '../doc-typo3-funcs.php'; get_footer(); ?>