ねごとめも背景

ねごとめも

数学、電気の勉強始めました!プログラムにも挑戦しています!|ω・)ノ


作成したプログラムは、こちらでも公開しています。
よかったら覗いてみてください。_( _´ω`)_
→ javascript,SVG で作成したプログラム置き場

PHP javascript タグ削除テスト(3)[ CDATA ]

今回は前回の javascript タグ削除テスト(2)の続き。
[ 修正箇所 ] 1) XML宣言, DTD宣言の記述を無視するように訂正。
2) textarea タグの内容を CDATA として出力。 ( textarea 内に textarea タグが存在する場合エラー )
3) html5 で定義されている空要素に、タグを閉じる記号 ( "/" ) 閉がなくても XML として出力。
その他、色々と修正。
textarea の HTML5 ドキュメントから XML ツリーを生成、文字列として出力まで。



■ xhtml.php


<?php
	class XHTML extends DOMDocument
	{
		private $doc;
		function __construct($version="1.0",$encoding="utf-8")
		{
			$this->doc=new parent($version,$encoding);
		}
		
		public function saveHTML()
		{
			return $this->doc->saveXML();
		}
		
		public function loadXHTML($contents,$option=0)
		{
			$this->setDomDocument($contents);
			/*
			$this->doc->loadHTML("<svg>a</svg>");
			$script=$this->doc->getElementsByTagName("script")->item(0)->nodeName;
			echo($script);
			$this->doc->loadXML($contents);
			*/
		}
		
		public function saveXHTML()
		{
			return $this->doc->saveXML();
		}
		
		private function setDomDocument($contents)
		{
			$doc=$this->doc;
			//$doc->preserveWhiteSpace=true;
			$doc->formatOutput=true;
			$target=$doc->createElement("root");
			//$target->setAttribute("xmlns","http://www.w3.org/1999/xhtml");
			$target=$doc->appendChild($target);
			$text="";
			$prev="";
			$type="text";
			$nodeName="";
			$attribute="";
			$quot_type="";
			$result="";
			foreach(str_split($contents) as $str)
			{
				switch($str)
				{
					case "<" :
							switch($type)
							{
								case "text" :
										$type="tagL";
										if(strlen($text)!=0)
										{
											$target->appendChild($doc->createTextNode($text));
											$text="";
										}
								break;

								case "commentR" :
										$type="commentL";
										$text.=$str;
								break;

								case "cdataR" :
										$type="cdataC";
										$text.=$str;
								break;

								case "dtd" :

								break;

								default :
										$text.=$str;
							}
					break;

					case ">" :
							switch($type)
							{
								case "tagL" :
										$nodeName=strtolower(trim($text));
										switch($nodeName)
										{
												case "area" :
												case "base" :
												case "br" :
												case "col" :
												case "command" :
												case "embed" :
												case "hr" :
												case "img" :
												case "input" :
												case "keygen" :
												case "link" :
												case "meta" :
												case "param" :
												case "source" :
												case "track" :
												case "wbr" :
														$target=$target->appendChild($doc->createElement($nodeName));
														$target=$target->parentNode;
														$text="";
														$type="text";
												break;
												
												case "textarea" :
														$target=$target->appendChild($doc->createElement($nodeName));
														$text="";
														$type="textArea";
												break;
												
												default :
														$target=$target->appendChild($doc->createElement($nodeName));
														$text="";
														$type=($nodeName=="script")? "script" : "text";
										}
								break;

								case "tagR" :
										$target=$target->parentNode;
										$text="";
										$type="text";
								break;

								case "commentR" :
										$text=preg_replace("/^--|--$/si","",$text);
										$target->appendChild($doc->createComment($text));
										$text="";
										$type="text";
								break;

								case "cdataR" :
										$text=preg_replace("/^\[[a-zA-Z]+\[|]]$/si","",$text);
										$target->appendChild($doc->createCDATASection($text));
										$text="";
										$type="text";
								break;
								
								case "script" :
									if($quot_type==""&&preg_match("/[.]*<\/script$/si",$text))
									{
										$text=preg_replace("/^.*<!\[CDATA\[(.*)\]\]>.*<\/script$/si","$1",$text);
										$text=preg_replace("/<\/script$/si","",$text);
										if(strlen(trim($text))!=0)
										{
											$target->appendChild($doc->createCDATASection($text));
										}
										$target=$target->parentNode;
										$type="text";
										$text="";
									}
									else
									{
										$text.=$str;
									}
								break;

								case "textArea" :
									if($quot_type==""&&preg_match("/.*<\/textarea$/si",$text))
									{
										$text=preg_replace("/^textarea|<\/textarea$/si","",$text);
										if(strlen(trim($text))!=0)
										{
											$target->appendChild($doc->createCDATASection($text));
										}
										$target=$target->parentNode;
										$type="text";
										$text="";
									}
									else
									{
										$text.=$str;
									}
								break;
								
								case "attribute" :
								case "valueL" :
											$text=preg_replace("/[ 	\r\n]*=[ 	\r\n]*/s","=",trim($text));
											foreach(explode(" ",$text) as $val)
											{
												if(!empty($val))
												{
													$attr=explode("=",$val);
													if(count($attr)==2)
													{
														$target->setAttribute(trim($attr[0]),trim($attr[1]));
													}
													else
													{
														$target->setAttribute(trim($attr[0]),trim($attr[0]));
													}
													$attribute=trim($val[0]);
												}
											}
											switch($nodeName)
											{
												case "area" :
												case "base" :
												case "br" :
												case "col" :
												case "command" :
												case "embed" :
												case "hr" :
												case "img" :
												case "input" :
												case "keygen" :
												case "link" :
												case "meta" :
												case "param" :
												case "source" :
												case "track" :
												case "wbr" :
														$target=$target->parentNode;
														$type="text";
														$text="";
												break;
												
												case "textarea" :
														$type="textArea";
														$text="";
												break;
												
													default:
															$type=($nodeName=="script")? "script" : "text";
															$text="";
											}
								break;

								case "dtd" :
										$type="text";
										$text="";
								break;
								
								
								default :
										$text.=$str;
							}
					break;

					case "/" :
							switch($type)
							{
								case "tagL" :
										$nodeName=strtolower(trim($text));
										switch($nodeName)
										{
												case "area" :
												case "base" :
												case "br" :
												case "col" :
												case "command" :
												case "embed" :
												case "hr" :
												case "img" :
												case "input" :
												case "keygen" :
												case "link" :
												case "meta" :
												case "param" :
												case "source" :
												case "track" :
												case "wbr" :
														$target=$target->appendChild($doc->createElement($nodeName));
														$type="tagR";
												break;
												
												default:
														$type="tagR";
										}
								break;

								case "commentR" :
										$type="commentL";
										$text.=$str;
								break;

								case "cdataR" :
										$type="cdataC";
										$text.=$str;
								break;

								case "attribute" :
										if(strlen(trim($text))!=0)
										{
											$attr=trim($text);
											foreach(explode(" ",$attr) as $val)
											{
												if(!empty($val))
												{
													$val=explode("=",$val);
													if(count($val)==1)
													{
														$target->setAttribute(trim($val[0]),trim($val[0]));
													}
													else
													{
														$target->setAttribute(trim($val[0]),trim($val[1]));
													}
												}
											}
										}
										$type="tagR";
								break;

								case "valueL" :
										//text.append(str);
								break;
								case "dtd" :

								break;

								default :
										$text.=$str;
							}
					break;

					case "!" :
							switch($type)
							{
								case "tagL" :
										if($prev=="<")
										{
											$type="dtd";
										}
								break;

								case "commentR" :
										$type="commentL";
										$text.=$str;
								break;

								case "cdataR" :
										$type="cdataC";
										$text.=$str;
								break;

								case "attribute" :
								case "dtd" :

								break;

								default :
										$text.=$str;
							}
					break;

					case "?" :
							switch($type)
							{
								case "tagL" :
										if($prev=="<")
										{
											$type="dtd";
										}
								break;

								default :
										$text.=$str;
							}
					break;

					case "-" :
							switch($type)
							{
								case "dtd" :
										if($prev=="-")
										{
											$type="commentL";
										}
										$text.=$str;
								break;

								case "commentL" :
										if($prev=="-")
										{
											$type="commentR";
										}
										$text.=$str;
								break;

								case "cdataR" :
										$type="cdataC";
										$text.=$str;
								break;

								default :
										$text.=$str;
							}

					break;

					case "[" :
							switch($type)
							{
								case "commentR" :
										$type="commentL";
										$text.=$str;
								break;

								case "dtd" :
										if($prev=="!")
										{
											$type="cdataC";
										}
										$text.=$str;
								break;

								case "cdataR" :
										$type="cdataC";
										$text.=$str;
								break;

								case "attribute":

								break;

								default:
										$text.=$str;
							}
					break;

					case "]" :
							switch($type)
							{
								case "commentR" :
										$type="commentL";
										$text.=$str;
								break;

								case "cdataC" :
										if($prev=="]")
										{
											$type="cdataR";
										}
										$text.=$str;
								break;

								case "attribute" :
								case "dtd" :

								break;

								default:
										$text.=$str;
							}
					break;

					case " " :
					case "	" :
							switch($type)
							{
								case "commentR" :
										$type="commentL";
										$text.=$str;
								break;

								case "cdataR" :
										$type="cdataC";
										$text.=$str;

								break;

								case "tagL" :
										$nodeName=strtolower(trim($text));
										$target=$target->appendChild($doc->createElement($nodeName));
										$text="";
										$type="attribute";
								break;

								case "dtd" :

								break;
								
								default:
										$text.=$str;
							}
					break;
					
					case "=" :
							switch($type)
							{
								case "attribute" :
										$type="valueL";
										$attribute=trim($text);
										$text.=$str;
								break;

								case "valueR" :
									if($quot_type=="")
									{
											$type="valueL";
											$attribute=trim($text);
									}
									else
									{
										$text.=$str;
									}
								break;
								
								case "commentR" :
										$type="commentL";
										$text.=$str;
								break;

								case "dtd" :

								break;
								
								default:
										$text.=$str;
							}
					break;

					case "'" :
					case "\"" :
							switch($type)
							{
								case "valueL" :
										if($quot_type=="")
										{
											$quot_type=$str;
											$type="valueR";
											$text="";
										}
								break;

								case "valueR" :
										if($quot_type==$str)
										{
											$attrs=explode(" ",trim($attribute));
											for($i=0;$i<count($attrs);$i++)
											{
												if(!empty($attrs[$i]))
												{
													$result=(count($attrs)-1!=$i)? $attrs[$i] : $text;
													$equal=explode("=",$attrs[$i]);
													if(count($attrs)!=0&&count($equal)==1)
													{
														$target->setAttribute($attrs[$i],$result);
													}
													else
													{
														$target->setAttribute($equal[0],$equal[1]);
													}
												}
											}
											$type="attribute";
											$quot_type="";
											$text="";
										}
										else
										{
											$text.=$str;
										}
								break;

								case "script" :
										if($quot_type=="")
										{
											$quot_type=$str;
											$type="js_value";
										}
										$text.=$str;
								break;

								case "js_value" :
										if($prev!="\\")
										{
											$quot_type="";
											$type="script";
										}
										$text.=$str;
								break;
								
								case "commentR" :
										$type="commentL";
										$text.=$str;
								break;

								case "dtd" :

								break;
								
								default:
										$text.=$str;
							}
					break;

					case "\r" :

					break;
					
					default :
							switch($type)
							{
								case "commentR" :
										$type="commentL";
										$text.=$str;
								break;

								case "cdataR" :
										$type="cdataC";
										$text.=$str;
								break;

								case "dtd" :

								break;

								default:
										$text.=$str;
							}
				}
				$prev=$str;
			}//end of foreach
			if(strlen($text)!=0)
			{
				$target->appendChild($doc->createTextNode($text));
			}
		}
	}

	if(isset($_POST["template"]))
	{
		libxml_use_internal_errors(true);
		$doc=new XHTML("1.0","utf-8");
		$contents=rawurldecode($_POST["template"]);
		$doc->loadXHTML($contents);
		//header("Content-type: text/xml");
		echo($doc->saveXHTML());
	}
?>
2013/06/16 [02:47]
  • category : php,
  • comment : 0

PHP javascript タグ削除テスト(2)[ CDATA ]

java 版 → java HTMLドキュメント文字列のツリー化(1)[ XML出力 ]

今回は前回の javascript タグ削除テスト(1)の続き。
前回作成した DOMDocument クラスを継承した自作 HTML クラスは、コメント, CDATA を記述した場合に、
エラーが出力されていた。
なので、今回は、コメント, CDATA が HTML ドキュメントに存在する場合は、
それぞれをコメント, CDATA として出力されるように訂正。
javascript タグの内容は前回と同じく CDATA として出力。
属性の "=" の前後に空白が含まれる場合に正しくツリー化して出力されるように訂正。
その他、色々と修正。

javascript タグを削除する流れは、
1) HTML ドキュメントを XHTML クラスの loadXHTMLの第一引数へ渡す。
2) XML としてツリー化された値が戻ってくる。
3) *サーバー上でXML ツリーから getElementsByTagName 関数、 removeChild 関数を利用して javascript タグを削除。
4) javascript タグを削除した XML ツリーを saveXHTML 関数を使用して HTML ドキュメントを文字列として出力。
*ajax を利用してクライアント側で responseXML でデータを受け取り、 javascript タグ削除も出来る?
今回も、 XML ツリーから javascript タグを削除するテストはやってない。
textarea の文字列の HTML ドキュメントを一文字づつ読み込み、
XML ツリーを生成後、文字列として出力まで。

  • *コメントの記述 [ 開始タグ( <! ) 終了タグ( --> ) ]
  • *CDATA の記述 [ 開始タグ( <![ ) 終了タグ( ]]> ) ]


■ xhtml.php


<?php
	class XHTML extends DOMDocument
	{
		private $doc;
		function __construct($version="1.0",$encoding="utf-8")
		{
			$this->doc=new parent($version,$encoding);
		}
		
		public function loadXHTML($contents,$option=0)
		{
			$this->setDomDocument($contents);
			/*
			$this->doc->loadHTML("<svg>a</svg>");
			$script=$this->doc->getElementsByTagName("script")->item(0)->nodeName;
			echo($script);
			$this->doc->loadXML($contents);
			*/
		}
		
		public function saveXHTML()
		{
			return $this->doc->saveXML();
		}
		
		private function setDomDocument($contents)
		{
			$doc=$this->doc;
			//$doc->preserveWhiteSpace=true;
			$doc->formatOutput=true;
			$root=$doc->createElement("div");
			$root->setAttribute("xmlns","http://www.w3.org/1999/xhtml");
			$target=$doc->appendChild($root);
			//$target->appendChild($doc->createComment("hoge"));
			$text="";
			$prev="\\";
			$type="text";
			$nodeName="";
			$attribute="";
			$quot_type="";
			foreach(str_split($contents) as $str)
			{
				switch($str)
				{
					case "<" :
							switch($type)
							{
								case "text" :
										$type="tagL";
										if(strlen($text)!=0)
										{
											$target->appendChild($doc->createTextNode($text));
											$text="";
										}
								break;
								
								case "commentR" :
										$type="commentL";
										$text.=$str;
								break;
								
								case "cdataR" :
										$type="cdataC";
										$text.=$str;
								break;
								
								default :
										$text.=$str;
							}
					break;
					
					case ">" :
							switch($type)
							{
								case "tagL" :
										$nodeName=strtolower(trim($text));
										$target=$target->appendChild($doc->createElement($nodeName));
										$text="";
										$type=($nodeName=="script")? "script" : "text";
								break;
								
								case "tagR" :
										$target=$target->parentNode;
										$text="";
										$type="text";
								break;
								
								case "commentR" :
										$text=preg_replace("/^--|--$/si","",$text);
										$target->appendChild($doc->createComment($text));
										$text="";
										$type="text";
								break;
								
								case "cdataR" :
										$text=preg_replace("/^\[[a-zA-Z]+\[|]]$/si","",$text);
										$target->appendChild($doc->createCDATASection($text));
										$text="";
										$type="text";
										
								break;
								
								case "attribute" :
										if(strlen(trim($text))!=0)
										{
											$attr=trim($text);
											foreach(explode(" ",$attr) as $val)
											{
												$target->setAttribute($val,$val);
											}
										}
										$text="";
										$type=($nodeName=="script")? "script" : "text";
								break;
								
								case "script" :
										if($quot_type==""&&preg_match("/[.]*<\/script$/si",$text))
										{
											$text=preg_replace("/<\/script$/si","",$text);
											$target->appendChild($doc->createCDATASection($text));
											$target=$target->parentNode;
											$type="text";
											$text="";
										}
										else
										{
											$text.=$str;
										}
								break;
								
								default :
										$text.=$str;
							}
					break;
					
					case "/" :
							switch($type)
							{
								case "tagL" :
										$type="tagR";
								break;
								
								case "commentR" :
										$type="commentL";
										$text.=$str;
								break;
								
								case "cdataR" :
										$type="cdataC";
										$text.=$str;
								break;
								
								case "attribute" :
										if(strlen(trim($text))!=0)
										{
											$attr=trim($text);
											foreach(explode(" ",$attr) as $val)
											{
												$target->setAttribute($val,$val);
											}
										}
										$type="tagR";
								break;
								
								default :
										$text.=$str;
							}
					break;
					
					case "!" :
							switch($type)
							{
								case "tagL" :
										$type="commentL";
								break;
								
								case "commentR" :
										$type="commentL";
										$text.=$str;
								break;
								
								case "cdataR" :
										$type="cdataC";
										$text.=$str;
								break;
								
								case "attribute" :
								
								break;
								
								default :
										$text.=$str;
							}
					
					break;
					
					case "-" :
							switch($type)
							{
								case "commentL" :
										if($prev=="-")
										{
											$type="commentR";
										}
										$text.=$str;
								break;
								
								case "cdataR" :
										$type="cdataC";
										$text.=$str;
								break;
								
								default :
										$text.=$str;
							}
					
					break;
					
					case "[" :
							switch($type)
							{
								case "commentR" :
										$type="commentL";
										$text.=$str;
								break;
								
								case "commentL" :
										if($prev=="!")
										{
											$type="cdataC";
										}
										$text.=$str;
								break;
								
								case "cdataR" :
										$type="cdataC";
										$text.=$str;
								break;
								
								case "attribute":
								
								break;
								
								default:
										$text.=$str;
							}
					break;
					
					case "]" :
							switch($type)
							{
								case "commentR" :
										$type="commentL";
										$text.=$str;
								break;
								
								case "cdataC" :
										if($prev=="]")
										{
											$type="cdataR";
										}
										$text.=$str;
								break;
								
								case "attribute" :
								
								break;
								
								default:
										$text.=$str;
							}
					break;
					
					case " " :
							switch($type)
							{
								case "commentL" :
										$type="commentL";
										$text.=$str;
								break;
								
								case "cdataR" :
										$type="cdataC";
										$text.=$str;
										
								break;
								
								case "tagL" :
										$nodeName=strtolower(trim($text));
										$target=$target->appendChild($doc->createElement($nodeName));
										$text="";
										$type="attribute";
								break;
								
								default:
										$text.=$str;
							}
					break;
					
					case "	" :
							switch($type)
							{
								case "commentL" :
										$type="commentL";
										$text.=$str;
								break;
								
								case "cdataR" :
										$type="cdataC";
										$text.=$str;
								break;
								
								case "tagL" :
										$nodeName=strtolower(trim($text));
										$target=$target->appendChild($doc->createElement($nodeName));
										$text="";
										$type="attribute";
								break;

								default:
										$text.=$str;
							}
					break;
					
					case "=" :
							switch($type)
							{
								case "attribute" :
										$type="valueL";
										$attribute=trim($text);
								break;
								
								case "valueR" :
										$type="valueL";
										$attribute=trim($text);
								break;
								
								default:
										$text.=$str;
							}
					break;
					
					case "'" :
							switch($type)
							{
								case "valueL" :
										if($quot_type=="")
										{
											$quot_type=$str;
											$type="valueR";
											$text="";
										}
								break;
								
								case "valueR" :
										if($quot_type==$str)
										{
											$attrs=explode(" ",trim($attribute));
											for($i=0;$i<count($attrs);$i++)
											{
												$txt=((count($attrs)-1)!=$i)? $attrs[$i] : $text;
												$target->setAttribute($attrs[$i],$txt);
											}
											$type="attribute";
											$quot_type="";
											$text="";
										}
										else
										{
											$text.=$str;
										}
								break;
								
								case "script" :
										if($quot_type=="")
										{
											$quot_type=$str;
											$type="js_value";
										}
										$text.=$str;
								break;
								
								case "js_value" :
										if($prev!="\\")
										{
											$quot_type="";
											$type="script";
										}
										$text.=$str;
								break;
								
								default:
										$text.=$str;
							}
					break;
					
					case "\"" :
							switch($type)
							{
								case "valueL" :
										if($quot_type=="")
										{
											$quot_type=$str;
											$type="valueR";
											$text="";
										}
								break;
								
								case "valueR" :
										if($quot_type==$str)
										{
											$target->setAttribute($attribute,$text);
											$type="attribute";
											$quot_type="";
											$text="";
										}
										else
										{
											$text.=$str;
										}
								break;
								
								case "script" :
										if($quot_type=="")
										{
											$quot_type=$str;
											$type="js_value";
										}
										$text.=$str;
								break;
								
								case "js_value" :
										if($prev!="\\")
										{
											$quot_type="";
											$type="script";
										}
										$text.=$str;
								break;
								
								default:
										$text.=$str;
							}
					break;
					
					default :
							switch($type)
							{
								case "commentR" :
										$type="commentL";
								break;
								
								case "cdataR" :
										$type="cdataC";
								break;
							}
							
							$text.=$str;
				}
				$prev=$str;
			}
			if(strlen($text)!=0)
			{
				$target->appendChild($doc->createTextNode($text));
			}
		}
	}
	
	if(isset($_POST["template"]))
	{
		$doc=new XHTML("1.0","utf-8");
		$doc->loadXHTML(rawurldecode($_POST["template"]));
		header("Content-type: text/xml");
		echo($doc->saveXHTML());
	}

?>

2013/06/06 [00:40]
  • category : php,
  • comment : 0

カウンター

プロフィール

negotoy

Author:negotoy
電気の勉強始めました!
テキストエディタを使ってプログラミングに挑戦中。fc2 ブログに公開しているテンプレート等は、自由にカスタマイズして、ご活用ください。プログラム実行の前に必ずコードの確認をお願いします。

最新記事

カテゴリ

カレンダー

07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -


PAGE TOP
広告: