A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Snippets Functions Classes
Home | PHP Resources | MySQL Zipbase | Forums
<?php
/**
* Take a look at the Remark-Lines of the function-header
*
* function autoAdjustToXHMTL($string)
*
* Tries to make out of the given string a xhtml-compatible string,
* that means that the return-string could be wrapped within a xml.
*
* Example: $string = "<big><I>something<br></big> blabla"
* return = "<big><i>something><br /></i></big> blabla"
*
* As you can see, the folowing will be changed:
* - converted "<I>" to "<i>", as all html-nodes will be converted to lowercase
* - converted "<br>" to "<br />" to make br xhtml-conform (same would be done with "img")
* - the closing of "</big>" will have do an implicite closing of "<i>" because <big> surrounds "<i>"
*
* Beware: the output-string is not the most beautiful code possible but hopefully xhtml-conform
*
* @param string: input string, html-style (as a browser should like it)
* @return: xhtml-compatible string
*
* Version
* V1.0, 20090721, rene@pilz.cc, initial-version
*
* Released under the terms of BSD (http://en.wikipedia.org/wiki/BSD_licenses)
*/
function autoAdjustToXHTML($string) {
$returnString="";
$string=trim($string);
$elementStack=array();
$stackPoint=0;
while ($string!="") {
$pos=strpos($string,"<");
if ($pos===false) {
// no "<" found, return full string and exit while
$returnString.=$string;
break;
}
// copy anythink up to the "<" into return string and reduce string
$returnString.=substr($string,0,$pos);
$string=trim(substr($string,$pos+1));
$tagName="";
// examine tag-name
$i=0; $c="";
for (;$i<strlen($string);$i++) {
$c=substr($string,$i,1);
if (strpos(";<",$c)!==false) continue; // some chars we ignore
if ($c==" "|| $c==">") break;
$tagName.=$c;
}
$tagName=strtolower($tagName); // convert uppercase
// is there a closing tag?
if (substr($tagName,0,1)=="/") {
// search for the closing ">" and ignore all before
$pos=strpos($string,">");
if ($pos===false) $pos=strlen($string);
$string=substr($string,$pos+1);
// close as many tags up to the given tag
while ($stackPoint>0) {
$stackPoint--;
$stackElement=$elementStack[$stackPoint];
$returnString.="</".$stackElement.">";
if ($stackElement==$tagName) break; // nothing more to do in this while
}
continue; // this element-Processing is finished so far, continue at 'while ($string!="") {'
}
// if we are here, we are within a tag (opening tag)
// Push tag on stack
$elementStack[$stackPoint]=$tagName;
$stackPoint++;
// add tag to returnString
$returnString.="<$tagName ";
// search up to ">"
$inApo=false; // within Apostrophes (" or ')
$fakeApo=false;
$apoChar="";
for (;$i<strlen($string);$i++) {
$c=substr($string,$i,1);
if ($fakeApo && strpos(" \t",$c)) {
$fakeApo=false;
$returnString.='"';
}
if (!$inApo && !$fakeApo && $c=='=' && !strpos(" \t'\"",substr($string,$i+1,1))) {
echo "test2=".substr($string,$i+1,1)."---";
$fakeApo=true;
$returnString.='="';
$c="";
}
if ($c==$apoChar && $inApo) { $inApo=false; $returnString.=$c." "; $c=""; }
if ($inApo && $c=="&" && strpos(substr($string,$i).";",";")>5) $c="&";
else if (($c=="'" || $c=='"') && !$inApo) { $inApo=true; $apoChar=$c; }
if ($c==">") break;
$returnString.=$c;
}
// new $string is the rest
$string=substr($string,$i+1);
$returnString=trim($returnString);
// check if this has a "/>" at the end
$endSlash=(substr($returnString,strlen($returnString)-1)=="/");
// some elements must have a "/" at the end --> Fake it if needed
if (($tagName=="br" || $tagName=="img") && !$endSlash) {
$returnString.="/";
$endSlash=true;
}
// check if it is a remark-line (<!-- --> trade this as with-endSlash-Tag)
if (substr($tagName,0,3)=="!--") {
$returnString=trim($returnString);
if (substr($returnString,strlen($returnString)-2)!="--") $returnString.=" --"; // make sure remark-line ends with "-->"
$endSlash=true;
}
// again, do we have a end-slash? (or a faked one?)
if ($endSlash) $stackPoint--; // just remove element from stack
// and now add the closing ">"
$returnString.=">";
}
// ok, we are allmost finish, just clean up the elementStack (from last to first)
while ($stackPoint>0) {
$stackPoint--;
$returnString.="</".$elementStack[$stackPoint].">";
}
return $returnString;
}
php?>
Suggested Difficulty Level: No votes yet.
Current Score: 2
Total votes: 2
Total Views: 1136
Other top snippets by renepilz:
1. Auth Class with (2.83 of 87)
2. Test Please Delete (2.83 of 30)
3. Return all repeated (3.64 of 72)
4. Convert an integer (3.3 of 71)
5. URL Shortening for (2.75 of 52)
6. Monthly Content Sorting (3 of 45)
7. Show String Trimmed (2.97 of 65)
8. Human readable file (2.01 of 70)
9. Randomize array values (2.8 of 82)
10. Create a recursive (3.35 of 55)
1. Parse RFC822 date (4 of 1)
2. Dynamic Image Uploading (5 of 1)
3. Spam Filter (0 of 0)
4. Is Multiple (0 of 0)
5. Base64 Encode / (0 of 0)
6. URL Encode / (0 of 0)
7. temp openbills (0 of 0)
8. Php Iban Validator (0 of 0)
9. Mysql Table Builder (0 of 0)
10. File size of (1.75 of 4)
11. Mail from your (1 of 1)
12. OddEven Class (0 of 0)
13. Detect if a (1 of 1)
14. MB CopyMCF-DIR :: (5 of 1)
15. Upper/Lower Case Accented (0 of 0)
16. Zodiac Signs (3 of 1)
17. Really useful code (2.5 of 2)
18. Calculate Central European (0 of 0)
19. Email Attachment (4 of 1)
20. ImageMagick Image Upload (0 of 0)
21. convert plain html (2 of 2)
22. Tag Builder (3.25 of 4)
23. Get Inserted ID (4.33 of 3)
24. Watermark An Image (3.33 of 3)
25. Check Prime Numbers (1.5 of 8)