<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>일상다반사(日常茶飯事) &amp;gt; 스터디 &amp;gt; PHP &amp;amp; Others</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php</link>
<language>ko</language>
<description>PHP &amp;amp; Others (2024-06-11 16:53:24)</description>

<item>
<title>전자서명, 사인 이미지</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2466</link>
<description><![CDATA[<p>&lt;style&gt;</p><p>#sig-canvas {</p><p>  border: 2px dotted #CCCCCC;</p><p>  border-radius: 15px;</p><p>  cursor: crosshair;</p><p>}</p><p>&lt;/style&gt;</p><p><br /></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>&lt;!-- Content --&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>&lt;div class="container"&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>&lt;div class="row"&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>&lt;div class="col-md-12"&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">				</span>&lt;h1&gt;E-Signature&lt;/h1&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">				</span>&lt;p&gt;Sign in the canvas below and save your signature as an image!&lt;/p&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>&lt;/div&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>&lt;/div&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>&lt;div class="row"&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>&lt;div class="col-md-12"&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span> <span style="white-space:pre;">		</span>&lt;canvas id="sig-canvas" width="620" height="160"&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span> <span style="white-space:pre;">			</span>Get a better browser, bro.</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span> <span style="white-space:pre;">		</span>&lt;/canvas&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span> <span style="white-space:pre;">	</span>&lt;/div&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>&lt;/div&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>&lt;div class="row"&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>&lt;div class="col-md-12"&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">				</span>&lt;button class="btn btn-primary" id="sig-submitBtn"&gt;Submit Signature&lt;/button&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">				</span>&lt;button class="btn btn-default" id="sig-clearBtn"&gt;Clear Signature&lt;/button&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>&lt;/div&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>&lt;/div&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>&lt;br/&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>&lt;div class="row"&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>&lt;div class="col-md-12"&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">				</span>&lt;textarea id="sig-dataUrl" class="form-control" rows="5"&gt;Data URL for your signature will go here!&lt;/textarea&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>&lt;/div&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>&lt;/div&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>&lt;br/&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>&lt;div class="row"&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>&lt;div class="col-md-12"&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">				</span>&lt;img id="sig-image" src="" alt="Your signature will go here!"/&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>&lt;/div&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>&lt;/div&gt;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>&lt;/div&gt;</span></p><p><span style="white-space:normal;"><br /></span></p><p><span style="white-space:normal;">&lt;script&gt;</span></p><p>(function() {</p><p>  window.requestAnimFrame = (function(callback) {</p><p>    return window.requestAnimationFrame ||</p><p>      window.webkitRequestAnimationFrame ||</p><p>      window.mozRequestAnimationFrame ||</p><p>      window.oRequestAnimationFrame ||</p><p>      window.msRequestAnimaitonFrame ||</p><p>      function(callback) {</p><p>        window.setTimeout(callback, 1000 / 60);</p><p>      };</p><p>  })();</p><p> </p><p>  const line_color  = "#000000";</p><p>  const line_width = 3;</p><p><br /></p><p>  var canvas = document.getElementById("sig-canvas");</p><p>  var ctx = canvas.getContext("2d");</p><p>  ctx.strokeStyle = line_color;</p><p>  ctx.lineWidth = line_width;</p><p><br /></p><p>  var drawing = false;</p><p>  var mousePos = {</p><p>    x: 0,</p><p>    y: 0</p><p>  };</p><p>  var lastPos = mousePos;</p><p><br /></p><p>  canvas.addEventListener("mousedown", function(e) {</p><p>    drawing = true;</p><p>    lastPos = getMousePos(canvas, e);</p><p>  }, false);</p><p><br /></p><p>  canvas.addEventListener("mouseup", function(e) {</p><p>    drawing = false;</p><p>  }, false);</p><p><br /></p><p>  canvas.addEventListener("mousemove", function(e) {</p><p>    mousePos = getMousePos(canvas, e);</p><p>  }, false);</p><p><br /></p><p>  // Add touch event support for mobile</p><p>  canvas.addEventListener("touchstart", function(e) {</p><p>    if (e.target == canvas) {</p><p>      e.preventDefault();</p><p>    }</p><p>  }, false);</p><p><br /></p><p>  canvas.addEventListener("touchmove", function(e) {</p><p>    var touch = e.touches[0];</p><p>    var me = new MouseEvent("mousemove", {</p><p>      clientX: touch.clientX,</p><p>      clientY: touch.clientY</p><p>    });</p><p>    canvas.dispatchEvent(me);</p><p>  }, false);</p><p><br /></p><p>  canvas.addEventListener("touchstart", function(e) {</p><p>    mousePos = getTouchPos(canvas, e);</p><p>    var touch = e.touches[0];</p><p>    var me = new MouseEvent("mousedown", {</p><p>      clientX: touch.clientX,</p><p>      clientY: touch.clientY</p><p>    });</p><p>    canvas.dispatchEvent(me);</p><p>  }, false);</p><p><br /></p><p>  canvas.addEventListener("touchend", function(e) {</p><p>    var me = new MouseEvent("mouseup", {});</p><p>    canvas.dispatchEvent(me);</p><p>  }, false);</p><p><br /></p><p>  function getMousePos(canvasDom, mouseEvent) {</p><p>    var rect = canvasDom.getBoundingClientRect();</p><p>    return {</p><p>      x: mouseEvent.clientX - rect.left,</p><p>      y: mouseEvent.clientY - rect.top</p><p>    }</p><p>  }</p><p><br /></p><p>  function getTouchPos(canvasDom, touchEvent) {</p><p>    var rect = canvasDom.getBoundingClientRect();</p><p>    return {</p><p>      x: touchEvent.touches[0].clientX - rect.left,</p><p>      y: touchEvent.touches[0].clientY - rect.top</p><p>    }</p><p>  }</p><p><br /></p><p>  function renderCanvas() {</p><p>    if (drawing) {</p><p>      ctx.moveTo(lastPos.x, lastPos.y);</p><p>      ctx.lineTo(mousePos.x, mousePos.y);</p><p>      ctx.stroke();</p><p>      lastPos = mousePos;</p><p>    }</p><p>  }</p><p><br /></p><p>  // Prevent scrolling when touching the canvas</p><p>  document.body.addEventListener("touchstart", function(e) {</p><p>    if (e.target == canvas) {</p><p>      e.preventDefault();</p><p>    }</p><p>  }, false);</p><p>  document.body.addEventListener("touchend", function(e) {</p><p>    if (e.target == canvas) {</p><p>      e.preventDefault();</p><p>    }</p><p>  }, false);</p><p>  document.body.addEventListener("touchmove", function(e) {</p><p>    if (e.target == canvas) {</p><p>      e.preventDefault();</p><p>    }</p><p>  }, false);</p><p><br /></p><p>  (function drawLoop() {</p><p>    requestAnimFrame(drawLoop);</p><p>    renderCanvas();</p><p>  })();</p><p><br /></p><p>  function clearCanvas() {</p><p>    canvas.width = canvas.width;</p><p>    ctx.lineWidth = line_width;<br /></p><p>  }</p><p><br /></p><p>  // Set up the UI</p><p>  var sigText = document.getElementById("sig-dataUrl");</p><p>  var sigImage = document.getElementById("sig-image");</p><p>  var clearBtn = document.getElementById("sig-clearBtn");</p><p>  var submitBtn = document.getElementById("sig-submitBtn");</p><p>  clearBtn.addEventListener("click", function(e) {</p><p>    clearCanvas();</p><p>    sigText.innerHTML = "Data URL for your signature will go here!";</p><p>    sigImage.setAttribute("src", "");</p><p>  }, false);</p><p>  submitBtn.addEventListener("click", function(e) {</p><p>    var dataUrl = canvas.toDataURL();</p><p>    sigText.innerHTML = dataUrl;</p><p>    sigImage.setAttribute("src", dataUrl);</p><p>  }, false);</p><p><br /></p><p>})();</p><p><span style="white-space:normal;">&lt;/script&gt;</span></p>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:date>2024-06-11T16:53:24+09:00</dc:date>
</item>


<item>
<title>input text 따옴표 처리</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2465</link>
<description><![CDATA[<p>&lt;input type="text" value="&lt;?php echo htmlentities($myValue); ?&gt;"&gt;<br /></p><p><br /></p><p>htmlspecialchars($myValue, ENT_QUOTES, 'UTF-8');</p><p>'&amp;' (ampersand) becomes '&amp;amp;'<br /></p><p>'"' (double quote) becomes '&amp;quot;' when ENT_NOQUOTES is not set.</p><p>''' (single quote) becomes '&amp;#039;' only when ENT_QUOTES is set.</p><p>'&lt;' (less than) becomes '&amp;lt;'</p><p>'&gt;' (greater than) becomes '&amp;gt;'</p><p><br /></p><p><br /></p><p>htmlspecialchars 는 예약된 HTML 문자만 인코딩하는 반면 htmlentities 는 HTML 표현이 있는 모든 것을 변환합니다</p>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:date>2023-10-23T12:46:29+09:00</dc:date>
</item>


<item>
<title>PHP - detect http request type in PHP (GET, POST, PUT, DELETE)</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2464</link>
<description><![CDATA[<p>출처 : <a href="https://dirask.com/posts/PHP-detect-http-request-type-in-PHP-GET-POST-PUT-DELETE-BDd8oD" rel="nofollow">https://dirask.com/posts/PHP-detect-http-request-type-in-PHP-GET-POST-PUT-DELETE-BDd8oD</a></p><p><br /></p><p><br /></p><p>backend.php<br /></p><p><br /></p><p>&lt;?php</p><p><br /></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>$method = $_SERVER['REQUEST_METHOD'];</span></p><p><br /></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>function parseInput()</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>{</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>$data = file_get_contents("php://input");</span></p><p><br /></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>if($data == false)</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>return array();</span></p><p><br /></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>parse_str($data, $result);</span></p><p><br /></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>return $result;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>}</span></p><p><br /></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>switch ($method)</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>{</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>case 'GET':</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>echo "GET request method\n";</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>echo print_r($_GET, true);</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>break;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>case 'POST':</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>echo "POST request method\n";</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>echo print_r($_POST, true);</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>break;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>case 'PUT':</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>$_PUT = parseInput();</span></p><p><br /></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>echo "PUT request method\n";</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>echo print_r($_PUT, true);</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>break;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>case 'DELETE':</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>$_DELETE = parseInput();</span></p><p><br /></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>echo "DELETE request method\n";</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>echo print_r($_DELETE, true);</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>break;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>default:</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>echo "Unknown request method.";</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>break;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>}</span></p><p><span style="white-space:normal;"><br /></span></p><p><br /></p><p><br /></p><p>ajax.htm<br /></p><p><br /></p><p>&lt;!doctype html&gt;</p><p>&lt;html lang="en"&gt;</p><p>&lt;head&gt;</p><p>    &lt;script src="<a href="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js" rel="nofollow">https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js</a>"&gt;&lt;/script&gt;</p><p>&lt;/head&gt;</p><p>&lt;body&gt;</p><p>&lt;pre id="response"&gt;&lt;/pre&gt;</p><p>&lt;script&gt;</p><p><br /></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>var handle = document.getElementById('response');</span></p><p><br /></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>$.ajax({</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>type: 'GET', // 'POST', 'PUT', 'DELETE'</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>url: '/backend.php',</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>data: {</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>name: 'John',</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>age: 25</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>},</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>success: function (data) {</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>handle.innerHTML = 'Response:\n' + data;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>},</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>error: function(error) {</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">			</span>handle.innerText = 'Error: ' + error.status;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>}</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>});</span></p><p><br /></p><p>&lt;/script&gt;</p><p>&lt;/body&gt;</p><p>&lt;/html&gt;</p><p><span style="font-family:'SFMono-Regular', Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;font-size:15.2px;background-color:rgb(252,252,253);"><br /></span></p><p><span style="font-family:'SFMono-Regular', Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;font-size:15.2px;background-color:rgb(252,252,253);"><br /></span></p>]]></description>
<dc:creator>nuno</dc:creator>
<dc:date>2023-06-02T09:53:47+09:00</dc:date>
</item>


<item>
<title>PHP BOM 제거, 공백제거</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2463</link>
<description><![CDATA[<p># BOM 제거</p><p>$string = preg_replace('/[\x00-\x1F\x80-\xFF]/','',$string) </p><p><br /></p><p># 공백 제거<br /></p><p>$string = preg_replace('/\s+/', '', $string);<br /></p>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:date>2023-02-16T16:08:07+09:00</dc:date>
</item>


<item>
<title>Following redirects with Curl in PHP</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2462</link>
<description><![CDATA[<h1 class="p-name" style="font-size:1.9em;font-family:'PT Serif', serif;background-color:rgb(238,238,238);">Following redirects with Curl in PHP.</h1><div class="e-content" style="font-family:'PT Serif', serif;font-size:19.2px;background-color:rgb(238,238,238);"><p style="line-height:1.75;">As a good web citizen, I try to always follow redirects. Not just in my browser, where I actually don’t have all that much control over things, but also a consumer of web services.</p><p style="line-height:1.75;">When doing requests with CURL, redirects are <em>not</em> followed by default.</p><div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight" style="padding:8px;background:rgb(0,0,0);line-height:1;color:rgb(255,255,255);font-family:Monaco, monospace;"><code style="padding:0px;margin:0px;background:transparent;border:0px;font-size:15.6px;"><span class="cp" style="color:rgb(117,113,94);">&lt;?php</span>

<span class="nv" style="color:rgb(248,248,242);">$curl</span> <span class="o" style="color:rgb(249,38,114);">=</span> <span class="nb" style="color:rgb(248,248,242);">curl_init</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="s1" style="color:rgb(230,219,116);">'http://example.org/someredirect'</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_POSTFIELDS</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="s2" style="color:rgb(230,219,116);">"foo"</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_POST</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="kc" style="color:rgb(102,217,239);">true</span><span class="p" style="color:rgb(248,248,242);">);</span>

<span class="nb" style="color:rgb(248,248,242);">curl_exec</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">);</span>

<span class="cp" style="color:rgb(117,113,94);">?&gt;</span>
</code></pre></div></div><p style="line-height:1.75;">Assuming the given url actually redirects like this:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight" style="padding:8px;background:rgb(0,0,0);line-height:1;color:rgb(255,255,255);font-family:Monaco, monospace;"><code style="padding:0px;margin:0px;background:transparent;border:0px;font-size:15.6px;">HTTP/1.1 301 Moved Permanently
Location: /newendpoint
</code></pre></div></div><p style="line-height:1.75;">Curl will automatically just stop. To make it follow redirects, the <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">FOLLOWLOCATION</code> setting is needed, as such:</p><div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight" style="padding:8px;background:rgb(0,0,0);line-height:1;color:rgb(255,255,255);font-family:Monaco, monospace;"><code style="padding:0px;margin:0px;background:transparent;border:0px;font-size:15.6px;"><span class="cp" style="color:rgb(117,113,94);">&lt;?php</span>

<span class="nv" style="color:rgb(248,248,242);">$curl</span> <span class="o" style="color:rgb(249,38,114);">=</span> <span class="nb" style="color:rgb(248,248,242);">curl_init</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="s1" style="color:rgb(230,219,116);">'http://example.org/someredirect'</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_POSTFIELDS</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="s2" style="color:rgb(230,219,116);">"foo"</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_FOLLOWLOCATION</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="kc" style="color:rgb(102,217,239);">true</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_POST</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="kc" style="color:rgb(102,217,239);">true</span><span class="p" style="color:rgb(248,248,242);">);</span>

<span class="nb" style="color:rgb(248,248,242);">curl_exec</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">);</span>

<span class="cp" style="color:rgb(117,113,94);">?&gt;</span>
</code></pre></div></div><p style="line-height:1.75;"><code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">CURLOPT_FOLLOWLOCATION</code> will follow the redirects up to 5 times (by default).</p><p style="line-height:1.75;">However, if you look at the second request, it actually does a <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">GET</code> request after the <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">POST</code>.</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight" style="padding:8px;background:rgb(0,0,0);line-height:1;color:rgb(255,255,255);font-family:Monaco, monospace;"><code style="padding:0px;margin:0px;background:transparent;border:0px;font-size:15.6px;">GET /newendpoint HTTP/1.1
</code></pre></div></div><p style="line-height:1.75;">This is also the default behavior for browsers, but actually non-conforming with the HTTP standard, and also not desirable for consumers of web services.</p><p style="line-height:1.75;">To fix this, all you have to do is use <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">CURLOPT_CUSTOMREQUEST</code> instead of <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">CURLOPT_POST</code>:</p><div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight" style="padding:8px;background:rgb(0,0,0);line-height:1;color:rgb(255,255,255);font-family:Monaco, monospace;"><code style="padding:0px;margin:0px;background:transparent;border:0px;font-size:15.6px;"><span class="cp" style="color:rgb(117,113,94);">&lt;?php</span>

<span class="nv" style="color:rgb(248,248,242);">$curl</span> <span class="o" style="color:rgb(249,38,114);">=</span> <span class="nb" style="color:rgb(248,248,242);">curl_init</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="s1" style="color:rgb(230,219,116);">'http://example.org/someredirect'</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_POSTFIELDS</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="s2" style="color:rgb(230,219,116);">"foo"</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_FOLLOWLOCATION</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="kc" style="color:rgb(102,217,239);">true</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_CUSTOMREQUEST</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="s2" style="color:rgb(230,219,116);">"POST"</span><span class="p" style="color:rgb(248,248,242);">);</span>

<span class="nb" style="color:rgb(248,248,242);">curl_exec</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">);</span>

<span class="cp" style="color:rgb(117,113,94);">?&gt;</span>
</code></pre></div></div><h2 style="font-size:1.7em;">Streams</h2><p style="line-height:1.75;">After doing this, the secondary request will be a <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">POST</code> request as well. There’s one more issue though, if you were doing a <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">POST</code> or a <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">PUT</code> request you probably had a request body attached.</p><p style="line-height:1.75;">There’s two ways to supply a request body, as a string or as a stream. If we were uploading a file it makes much more sense to use a stream, because it unlike posting a string, a stream doesn’t have to be kept in memory.</p><p style="line-height:1.75;">To upload a stream with curl, you need <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">CURLOPT_PUT</code> and <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">CURLOPT_INFILE</code>. Don’t let the name <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">CURLOPT_PUT</code> fool you, it’s use for every request, and without <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">CURLOPT_PUT</code>, <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">CURLOPT_INFILE</code> is ignored.</p><p style="line-height:1.75;">For example, this is how we could upload a large file using POST.</p><div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight" style="padding:8px;background:rgb(0,0,0);line-height:1;color:rgb(255,255,255);font-family:Monaco, monospace;"><code style="padding:0px;margin:0px;background:transparent;border:0px;font-size:15.6px;"><span class="cp" style="color:rgb(117,113,94);">&lt;?php</span>

<span class="nv" style="color:rgb(248,248,242);">$curl</span> <span class="o" style="color:rgb(249,38,114);">=</span> <span class="nb" style="color:rgb(248,248,242);">curl_init</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="s1" style="color:rgb(230,219,116);">'http://example.org/someredirect'</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_FOLLOWLOCATION</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="kc" style="color:rgb(102,217,239);">true</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_PUT</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="kc" style="color:rgb(102,217,239);">true</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_CUSTOMREQUEST</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="s2" style="color:rgb(230,219,116);">"POST"</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_INFILE</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="nb" style="color:rgb(248,248,242);">fopen</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="s1" style="color:rgb(230,219,116);">'largefile.json'</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="s1" style="color:rgb(230,219,116);">'r'</span><span class="p" style="color:rgb(248,248,242);">));</span>

<span class="nb" style="color:rgb(248,248,242);">curl_exec</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">);</span>

<span class="cp" style="color:rgb(117,113,94);">?&gt;</span>
</code></pre></div></div><p style="line-height:1.75;">This will work great, <em>unless</em> the target location redirects. If it does, curl will throw the following error:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight" style="padding:8px;background:rgb(0,0,0);line-height:1;color:rgb(255,255,255);font-family:Monaco, monospace;"><code style="padding:0px;margin:0px;background:transparent;border:0px;font-size:15.6px;">Necessary data rewind wasn't possible (code #65)
</code></pre></div></div><p style="line-height:1.75;">This seems to be related to <a href="https://bugs.php.net/bug.php?id=47204" style="color:rgb(0,0,153);" rel="nofollow">PHP bug #47204</a>.</p><p style="line-height:1.75;">Basically this means that you cannot use <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">CURLOPT_INFILE</code> and <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">CURLOPT_FOLLOWLOCATION</code> together. There’s two alternatives:</p><ol style="line-height:1.75;"><li>Don’t use <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">CURLOPT_INFILE</code>, but send the request body as a string instead, with <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">CURLOPT_POSTFIELDS</code>.</li><li>Don’t use <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">CURLOPT_FOLLOWLOCATION</code>, but instead manually check if the response was a 3xx redirect and manually follow each hop.</li></ol><h2 style="font-size:1.7em;">Strings</h2><p style="line-height:1.75;">Using <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">CURLOPT_POSTFIELDS</code> you can supply a request body as a string. Lets try to upload our earlier failed request using that method:</p><div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight" style="padding:8px;background:rgb(0,0,0);line-height:1;color:rgb(255,255,255);font-family:Monaco, monospace;"><code style="padding:0px;margin:0px;background:transparent;border:0px;font-size:15.6px;"><span class="cp" style="color:rgb(117,113,94);">&lt;?php</span>

<span class="nv" style="color:rgb(248,248,242);">$curl</span> <span class="o" style="color:rgb(249,38,114);">=</span> <span class="nb" style="color:rgb(248,248,242);">curl_init</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="s1" style="color:rgb(230,219,116);">'http://example.org/someredirect'</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_FOLLOWLOCATION</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="kc" style="color:rgb(102,217,239);">true</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_CUSTOMREQUEST</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="s2" style="color:rgb(230,219,116);">"POST"</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_POSTFIELDS</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="nb" style="color:rgb(248,248,242);">file_get_contents</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="s1" style="color:rgb(230,219,116);">'largefile.json'</span><span class="p" style="color:rgb(248,248,242);">));</span>

<span class="nb" style="color:rgb(248,248,242);">curl_exec</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">);</span>

<span class="cp" style="color:rgb(117,113,94);">?&gt;</span>
</code></pre></div></div><p style="line-height:1.75;">This also will not work exactly as you expect. While the second request to <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">/someredirect</code> will still be a POST request, it will be sent with an empty request body.</p><p style="line-height:1.75;">To fix this, use the undocumented <code class="language-plaintext highlighter-rouge" style="padding:2px;margin:0px;background-color:rgba(0,0,0,0.09);border:1px solid rgb(136,136,136);">CURLOPT_POSTREDIR</code> option.</p><div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight" style="padding:8px;background:rgb(0,0,0);line-height:1;color:rgb(255,255,255);font-family:Monaco, monospace;"><code style="padding:0px;margin:0px;background:transparent;border:0px;font-size:15.6px;"><span class="cp" style="color:rgb(117,113,94);">&lt;?php</span>

<span class="nv" style="color:rgb(248,248,242);">$curl</span> <span class="o" style="color:rgb(249,38,114);">=</span> <span class="nb" style="color:rgb(248,248,242);">curl_init</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="s1" style="color:rgb(230,219,116);">'http://example.org/someredirect'</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_FOLLOWLOCATION</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="kc" style="color:rgb(102,217,239);">true</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_CUSTOMREQUEST</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="s2" style="color:rgb(230,219,116);">"POST"</span><span class="p" style="color:rgb(248,248,242);">);</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_POSTFIELDS</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="nb" style="color:rgb(248,248,242);">file_get_contents</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="s1" style="color:rgb(230,219,116);">'largefile.json'</span><span class="p" style="color:rgb(248,248,242);">));</span>
<span class="nb" style="color:rgb(248,248,242);">curl_setopt</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="no" style="color:rgb(102,217,239);">CURLOPT_POSTREDIR</span><span class="p" style="color:rgb(248,248,242);">,</span> <span class="mi" style="color:rgb(174,129,255);">3</span><span class="p" style="color:rgb(248,248,242);">);</span>

<span class="nb" style="color:rgb(248,248,242);">curl_exec</span><span class="p" style="color:rgb(248,248,242);">(</span><span class="nv" style="color:rgb(248,248,242);">$curl</span><span class="p" style="color:rgb(248,248,242);">);</span>

<span class="cp" style="color:rgb(117,113,94);">?&gt;</span>
</code></pre></div></div><p style="line-height:1.75;">According to the PHP changelog, this was added in PHP 5.3.2, and according to <a href="https://bugs.php.net/bug.php?id=49571" style="color:rgb(0,0,153);" rel="nofollow">PHP bug #49571</a> there are four possible values:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight" style="padding:8px;background:rgb(0,0,0);line-height:1;color:rgb(255,255,255);font-family:Monaco, monospace;"><code style="padding:0px;margin:0px;background:transparent;border:0px;font-size:15.6px;">0 -&gt; do not set any behavior
1 -&gt; follow redirect with the same type of request only for 301 redirects.
2 -&gt; follow redirect with the same type of request only for 302 redirects.
3 -&gt; follow redirect with the same type of request both for 301 and 302 redirects.</code></pre></div></div></div>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:date>2021-04-27T13:09:39+09:00</dc:date>
</item>


<item>
<title>PHP 문자열 encode decode</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2461</link>
<description><![CDATA[<p>function encode($value) {</p><p>    if (!$value) {</p><p>        return false;</p><p>    }</p><p><br /></p><p>    $key = sha1('yourownkey');</p><p>    $strLen = strlen($value);</p><p>    $keyLen = strlen($key);</p><p>    $j = 0;</p><p>    $crypttext = '';</p><p><br /></p><p>    for ($i = 0; $i &lt; $strLen; $i++) {</p><p>        $ordStr = ord(substr($value, $i, 1));</p><p>        if ($j == $keyLen) {</p><p>            $j = 0;</p><p>        }</p><p>        $ordKey = ord(substr($key, $j, 1));</p><p>        $j++;</p><p>        $crypttext .= strrev(base_convert(dechex($ordStr + $ordKey), 16, 36));</p><p>    }</p><p><br /></p><p>    return $crypttext;</p><p>}</p><p><br /></p><p><br /></p><p>function decode($value) {</p><p>    if (!$value) {</p><p>        return false;</p><p>    }</p><p><br /></p><p>    $key = sha1('yourownkey');</p><p>    $strLen = strlen($value);</p><p>    $keyLen = strlen($key);</p><p>    $j = 0;</p><p>    $decrypttext = '';</p><p><br /></p><p>    for ($i = 0; $i &lt; $strLen; $i += 2) {</p><p>        $ordStr = hexdec(base_convert(strrev(substr($value, $i, 2)), 36, 16));</p><p>        if ($j == $keyLen) {</p><p>            $j = 0;</p><p>        }</p><p>        $ordKey = ord(substr($key, $j, 1));</p><p>        $j++;</p><p>        $decrypttext .= chr($ordStr - $ordKey);</p><p>    }</p><p><br /></p><p>    return $decrypttext;</p><p>}</p>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:date>2021-03-24T10:09:40+09:00</dc:date>
</item>


<item>
<title>웹호스팅 PHP 에러 표시</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2460</link>
<description><![CDATA[<p>호스팅 업체에서 PHP 에러 표시를 막아 놓은 경우</p><p>개발시에 어려움이 많다</p><p><br /></p><p>.htaccess 파일에 아래 내용 추가</p><p><br /></p><p>php_value error_reporting 22527</p><p>php_flag display_errors on</p><div><br /></div><div>개발이 끝난 후에는 </div><div>주석처리 또는 삭제</div>]]></description>
<dc:creator>nuno</dc:creator>
<dc:date>2021-03-09T15:08:05+09:00</dc:date>
</item>


<item>
<title>웹호스팅 사용자 MAX_INPUT_VARS 늘리는 방법</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2459</link>
<description><![CDATA[<p>펌 : <a href="https://www.happyjung.com/lecture/2955" rel="nofollow">https://www.happyjung.com/lecture/2955</a></p><p><br /></p><p>php.ini 의 설정을 살펴보면  max_input_vars 항목이 있습니다</p><p>max_input_vars = 1000</p><p><br /></p><p>php 5.x 어느순간부터 추가된 항목인데 ( 그 시점이 2012년도 2월경 )</p><p>이것으로 인해서 post 로 데이타를 전송할때 1000개 이상되는 변수값이 사라지는 문제가 발생합니다</p><p><br /></p><p>이것의 설정을 변경하는 방법은 2가지 입니다</p><p><br /></p><p><br /></p><p>1. php.ini 변경</p><p>max_input_vars 값을 2000 정도로 변경합니다</p><p><br /></p><p><br /></p><p>2. .htaccess 추가</p><p>.htaccess 파일 첫줄에 아래 내용을 추가합니다</p><p>PHP_VALUE max_input_vars 2000</p><p><br /></p><p>이것은 호스팅의 환경 또는 방화벽 등이 작동하는 경우에는 오류가 발생할 수 있습니다.</p><p>그럴때는 서버관리자에게 요청해서 수정해야 합니다.</p><p><br /></p><p><img src="http://nuno21.net/data/editor/2103/fcc62292fc5ea7fca5b435785433c586_1615269923_0775.jpg" title="fcc62292fc5ea7fca5b435785433c586_1615269923_0775.jpg" alt="fcc62292fc5ea7fca5b435785433c586_1615269923_0775.jpg" /><br style="clear:both;" /> </p><div><br /></div>]]></description>
<dc:creator>nuno</dc:creator>
<dc:date>2021-03-09T15:05:29+09:00</dc:date>
</item>


<item>
<title>그누보드 스마트에디터 링크 새창으로 띄우기</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2458</link>
<description><![CDATA[<p>스킨 / view.skin.php 수정</p><p><br /></p><p>target 미지정시 _blank로 변경</p><p><br /></p><p>$(function() {</p><p>    $("#bo_v_con a").each(function () {</p><p>        if(!$(this).attr("target")) {</p><p>            $(this).attr("target", "_blank");</p><p>        }</p><p>    });</p><p>}); </p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p style="margin-left:40px;"><br /></p>]]></description>
<dc:creator>nuno</dc:creator>
<dc:date>2020-11-05T10:16:16+09:00</dc:date>
</item>


<item>
<title>파일 확장자 구하기</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2457</link>
<description><![CDATA[<p>&lt;?php   </p><p>   $filename = "test.txt";</p><p><br /></p><p>   //1 strrchr함수를 사용해서 확장자 구하기</p><p>   $ext = substr(strrchr($filename, '.'), 1);</p><p>   echo$ext;</p><p>   echo"&lt;br&gt;";</p><p><br /></p><p>   //2 strrpos 함수와 substr함수를 사용해서 확장자 구하기</p><p>   $ext = substr($filename, strrpos($filename, '.') + 1);</p><p>   echo$ext;</p><p>   echo"&lt;br&gt;";</p><p><br /></p><p>   //3 expload 함수와 end 함수를 사용해서 확장자 구하기</p><p>   $ext = end(explode('.', $filename));</p><p>   echo$ext;</p><p>   echo"&lt;br&gt;";</p><p><br /></p><p>   //4 preg_replace 함수에 정규식을 대입해서 확장자 구하기</p><p>   $ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $filename);</p><p>   echo$ext;</p><p>   echo"&lt;br&gt;";</p><p><br /></p><p>   //5 pathinfo 함수를 사용해서 확장자 구하기</p><p>   $fileinfo = pathinfo($filename);</p><p>   $ext = $fileinfo['extension'];</p><p>   echo$ext;</p><p>?&gt;</p>]]></description>
<dc:creator>nuno</dc:creator>
<dc:date>2019-12-26T13:43:31+09:00</dc:date>
</item>


<item>
<title>php curl 모든 사용법 (로그인 유지, 쿠키 설정, post 등)</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2456</link>
<description><![CDATA[<p><br /></p><p><br /></p><p><a href="https://blog.naver.com/reviewer__/221560841117" rel="nofollow">https://blog.naver.com/reviewer__/221560841117</a></p><p><br /></p><p>php curl 모든 사용법 (로그인 유지, 쿠키 설정, post 등)</p><p><br /></p><p><br /></p><p>1) 기본 사용법</p><p><br /></p><p>기본적으로 호출된 url의 정보를 불러옵니다.</p><p><br /></p><p>$url = "<a href="http://www.example.com" rel="nofollow">http://www.example.com</a>"; //주소셋팅</p><p>$ch = curl_init(); //curl 로딩</p><p>curl_setopt($ch, CURLOPT_URL,$url); //curl에 url 셋팅</p><p>curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 이 셋팅은 1로 고정하는 것이 정신건강에 좋음</p><p><br /></p><p>$result = curl_exec ($ch); // curl 실행 및 결과값 저장</p><p>print_r($result); //출력</p><p>curl_close ($ch); // curl 종료</p><p>​</p><p><br /></p><p>2) https로 호출시 다음이 기본 호출 방법입니다.</p><p><br /></p><p>$url = "<a href="https://www.example.com" rel="nofollow">https://www.example.com</a>"; //주소셋팅</p><p>$ch = curl_init(); //curl 로딩</p><p>curl_setopt($ch, CURLOPT_URL,$url); //curl에 url 셋팅</p><p>curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 이 셋팅은 1로 고정하는 것이 정신건강에 좋음</p><p>curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //true로 설정시 일부 https 사이트는 안 열림</p><p>curl_setopt($ch, CURLOPT_SSLVERSION,3); //ssl 셋팅</p><p><br /></p><p>$result = curl_exec ($ch); // curl 실행 및 결과값 저장</p><p>print_r($result); //출력</p><p>curl_close ($ch); // curl 종료</p><p>​</p><p><br /></p><p>3) respone(호출한 url)의 header 값이 필요하면 다음 옵션을 활성화시키면 됩니다.</p><p><br /></p><p>​</p><p><br /></p><p>근데 거의 쓸일 없음</p><p><br /></p><p>curl_setopt($ch, CURLOPT_HEADER, 1 );</p><p>​</p><p><br /></p><p>​</p><p><br /></p><p>4) post 전송</p><p><br /></p><p>​</p><p><br /></p><p>get 전송은 url 셋팅하면 되는 거 아시죠?</p><p><br /></p><p>$url = "<a href="https://www.example.com" rel="nofollow">https://www.example.com</a>"; //주소셋팅</p><p>$postfields = 'id=sssss&amp;password=123456'; //post값 셋팅 (id값과 password 값이 셋팅됨)</p><p><br /></p><p>$ch = curl_init(); //curl 로딩</p><p>curl_setopt($ch, CURLOPT_URL,$url); //curl에 url 셋팅</p><p>curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 이 셋팅은 1로 고정하는 것이 정신건강에 좋음</p><p>curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 주소가 https가 아니라면 지울것</p><p>curl_setopt($ch, CURLOPT_SSLVERSION,3); // 주소가 https가 아니라면 지울것</p><p><br /></p><p>curl_setopt($ch, CURLOPT_POST, 1); // 포스트 전송 활성화 </p><p>curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields); // curl에 포스트값 셋팅</p><p><br /></p><p>$result = curl_exec ($ch); // curl 실행 및 결과값 저장</p><p>print_r($result); //출력</p><p>curl_close ($ch); // curl 종료</p><p>​</p><p><br /></p><p>​</p><p><br /></p><p>5) 쿠키 저장 및 가져오기</p><p><br /></p><p>​</p><p><br /></p><p>다음 옵션을 활성화시키면 됩니다. </p><p><br /></p><p>$filename = 'C:\example\http\static\cookie.txt'; // 윈도우에서는 절대주소 필요</p><p>$filename = './static/cookie.txt'; // 리눅스에서는 상대주소 사용하면됨</p><p><br /></p><p>curl_setopt($ch, CURLOPT_COOKIEJAR, $filename); // 쿠키 값을 저장시킵니다.</p><p>쿠키 값을 불러내려면 다음 옵션을 활성화시키면 됩니다.</p><p><br /></p><p>curl_setopt($ch, CURLOPT_COOKIEFILE, $filename); // 쿠키 값을 불러와 curl 실행시 같이 전송</p><p>​</p><p><br /></p><p>​</p><p><br /></p><p>6) 쿠키 값 직접 설정</p><p><br /></p><p>​</p><p><br /></p><p>일부 쿠키 값이 저장되지 않거나 필요할 때 다음 옵션을 사용합니다.</p><p><br /></p><p>curl_setopt($ch, CURLOPT_COOKIE, 'name=value'); // 쿠키 값이 "추가됨"</p><p>​</p><p><br /></p><p>​</p><p><br /></p><p>7) referer 설정</p><p><br /></p><p>​</p><p><br /></p><p>일부 사이트의 경우 referer을 검증 값으로 사용할 수 있으니 셋팅 방법을 알아둡시다</p><p><br /></p><p>curl_setopt($ch, CURLOPT_REFERER, '<a href="https://example.com" rel="nofollow">https://example.com</a>'); // https, http 구분하세요</p><p>​</p><p><br /></p><p>8) curl로 로그인 및 로그인 유지</p><p><br /></p><p>$url = "<a href="https://www.example.com/login" rel="nofollow">https://www.example.com/login</a> "; //로그인 확인 주소</p><p>$postfields = 'id=sssss&amp;password=123456'; //로그인 post 값</p><p>$filename = 'C:\example\http\static\cookie.txt'; // 윈도우에서는 절대주소 필요</p><p>$filename = './static/cookie.txt'; // 리눅스에서는 상대주소 사용하면됨</p><p><br /></p><p>$ch = curl_init(); //curl 로딩</p><p>curl_setopt($ch, CURLOPT_URL,$url); //curl에 url 셋팅</p><p>curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 이 셋팅은 1로 고정하는 것이 정신건강에 좋음</p><p>curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 주소가 https가 아니라면 지울것</p><p>curl_setopt($ch, CURLOPT_SSLVERSION,3); // 주소가 https가 아니라면 지울것</p><p><br /></p><p>curl_setopt($ch, CURLOPT_POST, 1); // 포스트 전송 활성화 </p><p>curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields); // curl에 포스트값 셋팅</p><p><br /></p><p>curl_setopt($ch, CURLOPT_COOKIEJAR, $filename); // respone되는 쿠키값을 저장함</p><p><br /></p><p>$result = curl_exec ($ch); // curl 실행 및 결과값 저장</p><p>print_r($result); //출력</p><p>curl_close ($ch); // curl 종료</p><p>이제 로그인 유지되었으니 홈페이지 내의 다른 url 을 호출할 수 있습니다.</p><p><br /></p><p>이때 쿠키 값이 계속 변할 수 있으니 쿠키 값 저장은 항상 활성화하는 것은 팁입니다.</p><p><br /></p><p>$url = "<a href="https://www.example.com/mypage" rel="nofollow">https://www.example.com/mypage</a> "; //마이페이지 접속 주소</p><p>$filename = 'C:\example\http\static\cookie.txt'; // 윈도우에서는 절대주소 필요</p><p>$filename = './static/cookie.txt'; // 리눅스에서는 상대주소 사용하면됨</p><p><br /></p><p>$ch = curl_init(); //curl 로딩</p><p>curl_setopt($ch, CURLOPT_URL,$url); //curl에 url 셋팅</p><p>curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 이 셋팅은 1로 고정하는 것이 정신건강에 좋음</p><p>curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 주소가 https가 아니라면 지울것</p><p>curl_setopt($ch, CURLOPT_SSLVERSION,3); // 주소가 https가 아니라면 지울것</p><p><br /></p><p>curl_setopt($ch, CURLOPT_POST, 1); // 포스트 전송 활성화 </p><p>curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields); // curl에 포스트값 셋팅</p><p><br /></p><p>curl_setopt($ch, CURLOPT_COOKIEJAR, $filename); // respone되는 쿠키값을 저장함</p><p>curl_setopt($ch, CURLOPT_COOKIEFILE, $filename); // 저장한 쿠키값을 불러옴</p><p><br /></p><p>$result = curl_exec ($ch); // curl 실행 및 결과값 저장</p><p>print_r($result); //출력</p><p>curl_close ($ch); // curl 종료</p><p>​</p><p><br /></p><p>​</p><p><br /></p><p>9) 호출된 url의 자바스크립트를 무시하려면 다음 옵션을 사용하십시오</p><p><br /></p><p>//location.href 같은 머리 아픈 옵션들을 가뿐히 버퍼 제어로 없앱니다 ^^</p><p>ob_start();</p><p>curl_exec ($ch);</p><p>ob_end_clean();</p><p>curl_close ($ch);</p><p>​</p><p><br /></p><p>​</p><p><br /></p><p>10) 파일 전송 또한 가능합니다.</p><p><br /></p><p>//참고주소 <a href="https://stackoverflow.com/questions/3085990/post-a-file-string-using-curl-in-php" rel="nofollow">https://stackoverflow.com/questions/3085990/post-a-file-string-using-curl-in-php</a></p><p>$delimiter_header = '----WebKitFormBoundary'.uniqid();</p><p>$delimiter = ''.$delimiter_header; // 사이트 규칙에 맞게 추가해주면됨. 잘모르면 빈칸 ㄱㄱ</p><p><br /></p><p>// 파일 셋팅</p><p>$fileFields = array(</p><p>    'name' =&gt; array(</p><p>        'name' =&gt; '',</p><p>        'type' =&gt; 'application/octet-stream',</p><p>        'content' =&gt; ''), </p><p>);</p><p><br /></p><p>//일반 post 값 셋팅</p><p>$postFields = array(</p><p>    'id' =&gt; '1234'</p><p>);</p><p><br /></p><p>$data = '';</p><p><br /></p><p>// 여기서부터는 전송값들 정렬(셋팅)</p><p>// populate normal fields first (simpler)</p><p>foreach ($postFields as $name =&gt; $content) {</p><p>    $data .= $delimiter . "\r\n";</p><p>    $data .= 'Content-Disposition: form-data; name="' . $name . '"';</p><p>    // note: double endline</p><p>    $data .= "\r\n\r\n";</p><p>    $data .= $content;</p><p>    $data .= "\r\n";</p><p>}</p><p><br /></p><p>// populate file fields</p><p>$data= '';</p><p>foreach ($fileFields as $name =&gt; $file) {</p><p>    $data .= $delimiter . "\r\n";</p><p>    // "filename" attribute is not essential; server-side scripts may use it</p><p>    $data .= 'Content-Disposition: form-data; name="' . $name . '";' .</p><p>        ' filename="'.$file['name'].'"' . "\r\n"; </p><p>    // this is, again, informative only; good practice to include though</p><p>    $data .= 'Content-Type: ' . $file['type'] . "\r\n";</p><p>    // this endline must be here to indicate end of headers</p><p>    $data .= "\r\n";</p><p>    // the file itself (note: there's no encoding of any kind)</p><p>    $data .= $file['content'] . "\r\n";</p><p>}</p><p><br /></p><p>$url = '<a href="http://example.com/file_upload" rel="nofollow">http://example.com/file_upload</a>'; // 파일 업로드 주소</p><p>$ch = curl_init();</p><p><br /></p><p>curl_setopt($ch, CURLOPT_HEADER, 1 );</p><p>curl_setopt($ch, CURLOPT_POST, true);</p><p>curl_setopt($ch, CURLOPT_HTTPHEADER , array('</p><p>    Content-Type: multipart/form-data; boundary=' . $delimiter_header,</p><p>    'Content-Length: ' . strlen($data)</p><p>    )); </p><p>curl_setopt($ch, CURLOPT_POSTFIELDS, $data);</p><p>curl_setopt($ch, CURLOPT_COOKIEJAR, $filename);</p><p>curl_setopt($ch, CURLOPT_COOKIEFILE, $filename);</p><p>curl_setopt($ch, CURLOPT_URL,"$url");</p><p><br /></p><p>ob_start();</p><p>curl_exec ($ch);</p><p>ob_end_clean();</p><p>curl_close ($ch);</p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p>--------------------------------------</p><p><br /></p><p><a href="https://gogoke1.blog.me/20205463546" rel="nofollow">https://gogoke1.blog.me/20205463546</a></p><p><br /></p><p>[php curl 쿠키 옵션 정보]</p><p><br /></p><p>libcurl에 쿠키 엔진을 사용하고 인터페이스하는 여러 가지 방법을 제공합니다. 이 옵션은 기본 API에 의해 제공되는 것입니다. libcurl에 바인딩은 다른 방법을 사용하여에 대한 액세스를 제공 할 수 있습니다.</p><p><br /></p><p>CURLOPT_COOKIE</p><p>서버에 보낼 쿠키 헤더의 정확한 내용을 지정하고자 할 때 사용된다.</p><p><br /></p><p>CURLOPT_COOKIEFILE</p><p>쿠키 엔진을 활성화 libcurl에에게 해, 지정된 파일 쿠키의 초기 설정을 읽을 수 있습니다. 읽기 전용.</p><p><br /></p><p>CURLOPT_COOKIEJAR</p><p>쿠키 엔진을 활성화 libcurl에 알려주기, 및 쉬운 핸들이 닫힐 때 지정된 cookiejar 파일에 알려진 모든 쿠키를 저장합니다. 쓰기 전용입니다.</p><p><br /></p><p>CURLOPT_COOKIELIST</p><p>쿠키의 내부 저장 장치에 추가 할 단일 쿠키에 대한 자세한 정보를 제공합니다. 설정 한 모든 세부 HTTP 헤더로 쿠키를 전달, 또는 넷스케이프 쿠키 파일에서 줄을 전달합니다. 또한이 옵션 등 쿠키를 세척하는데 사용될 수있다</p><p><br /></p><p>CURLINFO_COOKIELIST</p><p>링크리스트와 같은 내부 쿠키 저장소에서 쿠키 정보를 추출합니다.</p><p><br /></p><p><br /></p><p>---------------------------------</p><p><br /></p><p><a href="https://blog.naver.com/alzxcvbnm/221625744292" rel="nofollow">https://blog.naver.com/alzxcvbnm/221625744292</a></p><p><br /></p><p>[curl 커맨드에 쿠키 적용]</p><p><br /></p><p>curl -b cookie.txt -c cookie.txt abc.com</p><p><br /></p><p>-b 옵션으로 서버로부터 온 쿠키 정보를 저장할 파일을 지정하며</p><p>-c 옵션으로 리퀘스트를 보낼 때 같이 보낼 쿠키를 가지고 있는 파일을 지정한다.</p><p><br /></p><p><br /></p>]]></description>
<dc:creator>nuno</dc:creator>
<dc:date>2019-11-15T16:39:19+09:00</dc:date>
</item>


<item>
<title>encode / decode openssl_encrypt</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2455</link>
<description><![CDATA[<pre class="lang-php prettyprint prettyprinted" style="margin-top:0px;margin-bottom:1em;padding:12px 8px;border:0px;line-height:inherit;font-family:Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif;font-size:13px;vertical-align:baseline;width:auto;max-height:600px;background-color:rgb(239,240,241);color:rgb(57,51,24);"><code style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;line-height:inherit;font-family:Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif;vertical-align:baseline;white-space:inherit;"><span class="kwd" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(16,16,148);">class</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> </span><span class="typ" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(43,145,175);">Crypt</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> </span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">{</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">
   </span><span class="kwd" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(16,16,148);">static</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> </span><span class="kwd" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(16,16,148);">private</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> $default_method </span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">=</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> </span><span class="str" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(125,39,39);">"aes-256-cbc"</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">;</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">

   </span><span class="kwd" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(16,16,148);">public</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> </span><span class="kwd" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(16,16,148);">static</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> </span><span class="kwd" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(16,16,148);">function</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> doEncrypt</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">(</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">$text_to_encrypt</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">)</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> </span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">{</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">
      </span><span class="com" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(133,140,147);">// ...some preparation stuff here</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">
      $result </span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">=</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> base64_encode</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">(</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">openssl_encrypt</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">(</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">$text_to_encrypt</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">,</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> </span><span class="kwd" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(16,16,148);">self</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">::</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">$default_method</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">,</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> $seckey</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">,</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> OPENSSL_RAW_DATA</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">,</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> $iv</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">));</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">
      </span><span class="kwd" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(16,16,148);">return</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> $result</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">;</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">
    </span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">}</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">

   </span><span class="kwd" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(16,16,148);">public</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> </span><span class="kwd" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(16,16,148);">static</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> </span><span class="kwd" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(16,16,148);">function</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> doDecrypt</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">(</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">$encrypted_text</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">)</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> </span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">{</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">
      </span><span class="com" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(133,140,147);">// ...some preparation stuff here</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">
      $result </span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">=</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> openssl_decrypt</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">(</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">base64_decode</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">(</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">$encrypted_text</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">),</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> </span><span class="kwd" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(16,16,148);">self</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">::</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">$default_method</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">,</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> $seckey</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">,</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> OPENSSL_RAW_DATA</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">,</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> $iv</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">);</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">

      </span><span class="kwd" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(16,16,148);">return</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);"> $result</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">;</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">
   </span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">}</span><span class="pln" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">
</span><span class="pun" style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-family:inherit;vertical-align:baseline;color:rgb(48,51,54);">}</span></code></pre>]]></description>
<dc:creator>nuno</dc:creator>
<dc:date>2019-11-13T15:43:06+09:00</dc:date>
</item>


<item>
<title>jquery ajax php 예제</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2454</link>
<description><![CDATA[<p>&lt;div&gt;</p><p>내용 : &lt;span id="content_1"&gt;없음&lt;/span&gt;</p><p>&lt;button type="button" id="btn_1" value="1 class="btn"&gt;클릭&lt;/button&gt;</p><p>&lt;/div&gt;</p><p><br /></p><p><br /></p><p>&lt;script&gt;</p><p>$(".btn").click(function(){</p><p><br /></p><p>  var i = $(this).val();</p><p><br /></p><p>  $.ajax({ </p><p>            url: '<a href="http://test.com/ajax_result.php" rel="nofollow">http://test.com/ajax_result.php</a>',</p><p>            data: {'seq_id': i}, </p><p>            dataType: 'json',  /// json으로 결과를 받음 </p><p>            //processData: false,  //DOM 또는 urlencode 처리되지 않은 데이터를 보낼때 false 설정 //기본값은 true</p><p>            type: 'POST', </p><p>            success: function (data) { </p><p>         </p><p>                if (data.result === "success") { </p><p>                    $('#content_'+i).text(data.content); </p><p><br /></p><p>                } else { </p><p>                    console.log("data error"); </p><p>                    alert('데이터 오류입니다');</p><p>                } </p><p>                </p><p>            },</p><p>            error: function(xhr, status, error) {</p><p>                //alert(xhr.responseText);</p><p>                console.log(xhr.responseText);</p><p>            }</p><p>        }); </p><p>});</p><p><br /></p><p>&lt;/script&gt;</p><p><br /></p><p><br /></p><p><br /></p><p>ajax_result.php</p><p><br /></p><p>&lt;?php</p><p>.</p><p>.</p><p>.</p><p>$sql = " select content from table where seq_id='$seq_id' ";</p><p>.</p><p>.</p><p>.</p><p>if(...)</p><p><span style="white-space:pre;">	</span>$result = 'success';</p><p>else</p><p><span style="white-space:pre;">	</span>$result = 'fail';</p><p>.</p><p>.</p><p>.</p><p><br /></p><p><br /></p><p>$json = array('result'=&gt;$result, 'content'=&gt;$content);</p><p><br /></p><p>echo json_encode($json);</p><p>?&gt;</p>]]></description>
<dc:creator>nuno</dc:creator>
<dc:date>2019-07-18T15:31:59+09:00</dc:date>
</item>


<item>
<title>PHP 문자열 유니코드 상호변환</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2453</link>
<description><![CDATA[<p>출처 : <a href="https://blog.naver.com/bsos1202/221039996477" rel="nofollow">https://blog.naver.com/bsos1202/221039996477</a></p><p><br /></p><p><br /></p><table border="0" cellpadding="0" cellspacing="0" class="__se_tbl" style="font-family:'994268_10';font-size:13.3333px;background-color:rgb(255,255,255);border-width:1px 1px 0px 0px;border-top-style:solid;border-right-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);"><tbody><tr><td style="border-width:0px 0px 1px 1px;border-bottom-style:solid;border-left-style:solid;border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);width:546px;height:17px;"><p align="center" style="line-height:1.5;text-align:center;"><b><span style="font-size:18pt;"> PHP 문자열 유니코드 상호변환</span></b></p></td></tr></tbody></table><p style="line-height:1.5;font-family:'994268_10';font-size:13.3333px;text-align:justify;background-color:rgb(255,255,255);"><br /></p><p style="line-height:1.5;font-family:'994268_10';font-size:13.3333px;text-align:justify;background-color:rgb(255,255,255);">php를 베이스로 한 시스템에서 타 시스템간 문자열 전송 시</p><p style="line-height:1.5;font-family:'994268_10';font-size:13.3333px;text-align:justify;background-color:rgb(255,255,255);">캐릭터셋의 유지를 위해 혹은 기타 이유로 유니코드의 상호변경이 필요할 수 있다.</p><p style="line-height:1.5;font-family:'994268_10';font-size:13.3333px;text-align:justify;background-color:rgb(255,255,255);"><br /></p><p style="line-height:1.5;font-family:'994268_10';font-size:13.3333px;text-align:justify;background-color:rgb(255,255,255);">java에서는 Integer.toHexString((in)charAt(i)) 를 통해 가능하며</p><p style="line-height:1.5;font-family:'994268_10';font-size:13.3333px;text-align:justify;background-color:rgb(255,255,255);">php를 통한 변환은 아래 코드와 같다.</p><p style="line-height:1.5;font-family:'994268_10';font-size:13.3333px;text-align:justify;background-color:rgb(255,255,255);"><br /></p><div class="colorscripter-code" style="line-height:1.5;font-size:13.3333px;text-align:justify;background-color:rgb(255,255,255);color:rgb(240,240,240);font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;"><table class="colorscripter-code-table" cellspacing="0" cellpadding="0" style="text-align:left;margin:0px;padding:0px;border:none;background-color:rgb(39,39,39);"><tbody><tr><td style="padding:6px;border-right:2px solid rgb(79,79,79);"><div style="line-height:17.3333px;margin:0px;padding:0px;text-align:right;color:rgb(170,170,170);"><div style="line-height:17.3333px;">1</div><div style="line-height:17.3333px;">2</div><div style="line-height:17.3333px;">3</div><div style="line-height:17.3333px;">4</div><div style="line-height:17.3333px;">5</div><div style="line-height:17.3333px;">6</div><div style="line-height:17.3333px;">7</div><div style="line-height:17.3333px;">8</div><div style="line-height:17.3333px;">9</div><div style="line-height:17.3333px;">10</div><div style="line-height:17.3333px;">11</div><div style="line-height:17.3333px;">12</div><div style="line-height:17.3333px;">13</div><div style="line-height:17.3333px;">14</div><div style="line-height:17.3333px;">15</div><div style="line-height:17.3333px;">16</div><div style="line-height:17.3333px;">17</div><div style="line-height:17.3333px;">18</div><div style="line-height:17.3333px;">19</div><div style="line-height:17.3333px;">20</div><div style="line-height:17.3333px;">21</div></div></td><td style="padding:6px 0px;"><div style="line-height:17.3333px;margin:0px;padding:0px;"><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;"><span style="color:rgb(255,126,0);">&lt;?php</span></div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;"> </div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;"><span style="color:rgb(255,51,153);">if</span> (<span style="color:rgb(0,134,179);"></span><span style="color:rgb(255,51,153);">!</span>function_exists(<span style="color:rgb(255,213,0);">'unicode_encode'</span>)) {</div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;">    <span style="color:rgb(255,51,153);">function</span> unicode_encode(<span style="color:rgb(75,230,250);">$str</span>) {</div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;">        <span style="color:rgb(255,51,153);">return</span> <span style="color:rgb(75,230,250);">substr</span>(json_encode(<span style="color:rgb(75,230,250);">$str</span>), <span style="color:rgb(193,10,255);">1</span>, <span style="color:rgb(0,134,179);"></span><span style="color:rgb(255,51,153);">-</span><span style="color:rgb(193,10,255);">1</span>);</div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;">    }</div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;">}</div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;"> </div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;"><span style="color:rgb(255,51,153);">if</span> (<span style="color:rgb(0,134,179);"></span><span style="color:rgb(255,51,153);">!</span>function_exists(<span style="color:rgb(255,213,0);">'unicode_decode'</span>)) {</div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;">    <span style="color:rgb(255,51,153);">function</span> unicode_decode(<span style="color:rgb(75,230,250);">$str</span>) {</div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;">        <span style="color:rgb(255,51,153);">return</span> json_decode(sprintf(<span style="color:rgb(255,213,0);">'"%s"'</span>, <span style="color:rgb(75,230,250);">$str</span>));</div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;">    }</div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;">}</div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;"> </div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;"><span style="color:rgb(75,230,250);">$in</span> <span style="color:rgb(0,134,179);"></span><span style="color:rgb(255,51,153);">=</span> <span style="color:rgb(255,213,0);">'\uc138\uc158\uc774'</span>;</div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;"><span style="color:rgb(153,153,153);">//$in = '세션이';</span></div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;"><span style="color:rgb(75,230,250);">echo</span> <span style="color:rgb(255,213,0);">"ㅁ1 = "</span>.unicode_encode(<span style="color:rgb(75,230,250);">$in</span>).PHP_EOL.<span style="color:rgb(255,213,0);">"&lt;br /&gt;\n"</span>;</div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;"><span style="color:rgb(75,230,250);">echo</span> <span style="color:rgb(255,213,0);">"ㅁ2 = "</span>.unicode_decode(<span style="color:rgb(75,230,250);">$in</span>).PHP_EOL.<span style="color:rgb(255,213,0);">"&lt;br /&gt;\n"</span>;</div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;"> </div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;"> </div><div style="line-height:17.3333px;padding:0px 6px;white-space:pre;"><span style="color:rgb(255,126,0);">?&gt;</span></div></div><div style="line-height:1.5;text-align:right;margin-top:-13px;margin-right:5px;font-size:9px;font-style:italic;"><a href="http://colorscripter.com/info#e" target="_blank" class="con_link" style="color:rgb(79,79,79);" rel="nofollow noreferrer noopener">Colored by Color Scripter</a></div></td><td style="vertical-align:bottom;padding:0px 2px 4px 0px;"><a href="http://colorscripter.com/info#e" target="_blank" class="con_link" style="color:#FFFFFF;" rel="nofollow noreferrer noopener"><span style="font-size:9px;background-color:rgb(79,79,79);padding:1px;">cs</span></a></td></tr></tbody></table></div><p style="line-height:1.5;font-family:'994268_10';font-size:13.3333px;text-align:justify;background-color:rgb(255,255,255);"><br /></p><p style="line-height:1.5;font-family:'994268_10';font-size:13.3333px;text-align:justify;background-color:rgb(255,255,255);">주석문과 같이 한글로 하게되면 역으로 변환이 가능한 소스코드이다.</p><p style="line-height:1.5;font-family:'994268_10';font-size:13.3333px;text-align:justify;background-color:rgb(255,255,255);">굉장히 심플하게 구현이 가능하다.</p><p style="line-height:1.5;font-family:'994268_10';font-size:13.3333px;text-align:justify;background-color:rgb(255,255,255);"><br /></p><p style="line-height:1.5;font-family:'994268_10';font-size:13.3333px;text-align:justify;background-color:rgb(255,255,255);">-----------------------------------------------------------------------------</p><p style="line-height:1.5;font-family:'994268_10';font-size:13.3333px;text-align:justify;background-color:rgb(255,255,255);">출처 : <a href="https://sir.kr/g5_tip/11194" style="font-family:'돋움', Dotum, Helvetica, sans-serif;font-size:12px;" rel="nofollow">https://sir.kr/g5_tip/11194</a></p><p style="line-height:1.5;font-family:'994268_10';font-size:13.3333px;text-align:justify;background-color:rgb(255,255,255);"><br /></p><p style="line-height:1.5;font-family:'994268_10';font-size:13.3333px;text-align:justify;background-color:rgb(255,255,255);"><strong style="margin:0px 70px 0px 0px;font-size:1.33em;line-height:1.3em;color:rgb(34,34,34);font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;">json 데이터 유니코드로 나올때</strong><strong style="margin:0px 70px 0px 0px;font-size:1.33em;line-height:1.3em;color:rgb(34,34,34);font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;"> </strong></p><p style="color:rgb(34,34,34);font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;font-size:14.004px;">ajax로 데이터 요청이 필요해서 작업하던 도중 데이터가 유니코드로 나와서</p><p style="color:rgb(34,34,34);font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;font-size:14.004px;">찾아서 수정한 내용 공유합니다. <span style="background-color:rgb(46,204,113);">JSON_UNESCAPED_UNICODE</span></p><p style="color:rgb(34,34,34);font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;font-size:14.004px;"> </p><p><span style="font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;color:rgb(34,34,34);"><span style="font-size:14.004px;">&lt;?php</span></span></p><p><span style="font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;color:rgb(34,34,34);"><span style="font-size:14.004px;">header("Content-Type:application/json");</span></span></p><p><span style="font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;color:rgb(34,34,34);"><span style="font-size:14.004px;">$data = array();</span></span></p><p><span style="font-size:14.004px;color:rgb(34,34,34);font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;"><br /></span></p><p><span style="font-size:14.004px;color:rgb(34,34,34);font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;">$ttt = array();</span> </p><p><span style="font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;color:rgb(34,34,34);"><span style="font-size:14.004px;"><br /></span></span></p><p><span style="font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;color:rgb(34,34,34);"><span style="font-size:14.004px;">$ttt['it_id'] = 'itid';</span></span></p><p><span style="font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;color:rgb(34,34,34);"><span style="font-size:14.004px;">$ttt['it_name'] = 'itname';</span></span></p><p><span style="font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;color:rgb(34,34,34);"><span style="font-size:14.004px;">$ttt['it_bbb'] = '한글 이번엔';</span></span></p><p><span style="font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;color:rgb(34,34,34);"><span style="font-size:14.004px;"><br /></span></span></p><p><span style="font-size:14.004px;color:rgb(34,34,34);font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;">$data['ttt']=$ttt;</span> </p><p><span style="font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;color:rgb(34,34,34);"><span style="font-size:14.004px;">$data['view']='aaa';</span></span></p><p><span style="font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;color:rgb(34,34,34);"><span style="font-size:14.004px;">$data['answer']='bbb';</span></span></p><p><span style="font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;color:rgb(34,34,34);"><span style="font-size:14.004px;"><br /></span></span></p><p><span style="font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;color:rgb(34,34,34);"><span style="font-size:14.004px;">echo json_encode($data,JSON_UNESCAPED_UNICODE); </span></span></p><p><span style="font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;color:rgb(34,34,34);"><span style="font-size:14.004px;">?&gt;</span></span></p><p><span style="font-size:14.004px;color:rgb(34,34,34);font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;"><br /></span></p><p><span style="font-size:14.004px;color:rgb(34,34,34);font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;">{"ttt":{"it_id":"itid","it_name":"itname","it_bbb":"\ud55c\uae00 \uc774\ubc88\uc5d4"},"view":"aaa","answer":"bbb"}</span> </p><p><span style="font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;color:rgb(34,34,34);"><span style="font-size:14.004px;"><br /></span></span></p><p><span style="font-size:14.004px;color:rgb(34,34,34);font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;">{"ttt":{"it_id":"itid","it_name":"itname","it_bbb":"한글 이번엔"},"view":"aaa","answer":"bbb"}</span> </p><p><span style="font-size:14.004px;color:rgb(34,34,34);font-family:'Apple SD Gothic Neo', 'Malgun Gothic', '맑은 고딕', sans-serif;"><br /></span></p>]]></description>
<dc:creator>nuno</dc:creator>
<dc:date>2019-06-17T11:37:22+09:00</dc:date>
</item>


<item>
<title>Mysql PASSWORD(), olo_password() PHP 함수</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2452</link>
<description><![CDATA[<p>function mysqlPassword($pw) {</p><p>   //SELECT CONCAT('*', UPPER(SHA1(UNHEX(SHA1('$pw'))))); //sql 이용</p><p>    return '*'.strtoupper(sha1(sha1($pw, true)));    </p><p>}</p><p><br /></p><p>function old_password($password) {</p><p>    if ($password == '')</p><p>        return '';</p><p> </p><p>    $nr = 1345345333;</p><p>    $add = 7;</p><p>    $nr2 = 0x12345671;</p><p>    foreach(str_split($password) as $c) {</p><p>        if ($c == ' ' or $c == "\t")</p><p>            continue;</p><p>        $tmp = ord($c);</p><p>        $nr ^= ((($nr &amp; 63) + $add) * $tmp) + (($nr &lt;&lt; 8) &amp; 0xFFFFFFFF);</p><p>        $nr2 += (($nr2 &lt;&lt; 8) &amp; 0xFFFFFFFF) ^ $nr;</p><p>        $add += $tmp;</p><p>    }</p><p> </p><p>    if ($nr2 &gt; PHP_INT_MAX)</p><p>        $nr2 += PHP_INT_MAX + 1;</p><p> </p><p>    $bit = (1 &lt;&lt; 31) -1;</p><p> </p><p>    return sprintf("%08lx%08lx", $nr &amp; $bit, $nr2 &amp; $bit);</p><p>}</p>]]></description>
<dc:creator>nuno</dc:creator>
<dc:date>2019-01-17T14:58:18+09:00</dc:date>
</item>


<item>
<title>배열 stripslashes</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2451</link>
<description><![CDATA[<p>function stripslashes_deep($value)</p><p>{</p><p>    $value = is_array($value) ?</p><p>                array_map('stripslashes_deep', $value) :</p><p>                stripslashes($value);</p><p><br /></p><p>    return $value;</p><p>}</p><p><br /></p><p>$array = stripslashes_deep($array);</p><div><br /></div>]]></description>
<dc:creator>nuno</dc:creator>
<dc:date>2018-11-02T09:47:52+09:00</dc:date>
</item>


<item>
<title>PHP 유용한 정규표현식 예제</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2450</link>
<description><![CDATA[<p># 영문자, 숫자, -, _ 만 허용</p><p>$result = preg_replace('/[^0-9a-z-_]/i', '', $str);</p><p><br /></p><p># 한글, 영문자, 숫자, -, _ 만 허용</p><p>$q = preg_replace('/[^가-힣0-9a-z-_]/i', '', $q);<br /></p>]]></description>
<dc:creator>nuno</dc:creator>
<dc:date>2018-10-16T17:21:39+09:00</dc:date>
</item>


<item>
<title>php 섭씨 화씨 변환</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2449</link>
<description><![CDATA[<p>function f2c($f) {</p><p>    $c = ($f - 32) * 5 / 9;</p><p>    return number_format($c, 1).' ℃';</p><p>}</p><p> </p><p>function c2f($c) {</p><p>    $f = $c * 9 / 5 + 32; </p><p>    return number_format($f, 1).' ℉';</p><p>}</p><p> </p><p> </p>]]></description>
<dc:creator>nuno</dc:creator>
<dc:date>2017-01-16T18:03:47+09:00</dc:date>
</item>


<item>
<title>[Node.js] 배우는 방법</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2448</link>
<description><![CDATA[<p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">[펌] <a href="http://mobicon.tistory.com/category/NodeJS" rel="nofollow">http://mobicon.tistory.com/category/NodeJS</a></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"> </p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"> </p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">Node.js를 제대로 배워보고 싶다면 이렇게 시작해보자</p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"> </p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"><b><span style="font-size:14pt;">1. Node.js 사용 영역</span></b></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">  - fast, real-time 어플리케이션 개발</p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">  - scalable 확장가능성이 높은 어플리케이션 개발</p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">  - data-driven modern web 어플리케이션 개발</p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">  * <a href="http://sangminpark.wordpress.com/2011/09/22/%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%83%88-%EC%88%A0-%EB%8B%B4%EB%8A%94-%EB%B6%80%EB%8C%80/" target="_blank" class="tx-link" style="color:rgb(92,126,159);text-decoration:none;" rel="nofollow noreferrer noopener"><span style="color:rgb(9,0,255);">클라우드 환경 이해</span></a></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"> </p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"> </p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"><b><span style="font-size:14pt;">2. 잘 못 된 코스</span><span style="font-size:14pt;"> </span></b></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">  - 온라인 및 동영상 강좌들부터 보지 말기</p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">  - 서점에서 서평들 읽고 책 고르지 말기 </p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"> </p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"> </p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"><b><span style="font-size:14pt;">3. 제대로 된 코스</span></b></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">  - 봐야할 리소스 </p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">    + 초보 : <a href="http://www.nodebeginner.org/index-kr.html" target="_blank" class="tx-link" style="color:rgb(92,126,159);text-decoration:none;" rel="nofollow noreferrer noopener">The Node Beginner Book 번역본</a></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">  <span style="font-size:9pt;line-height:1.5;">  + </span><b style="font-size:9pt;line-height:1.5;"><span style="color:rgb(9,0,255);"><a href="http://pismute.github.io/nodeguide.com/beginner.html" target="_blank" class="tx-link" style="color:rgb(92,126,159);text-decoration:none;" rel="nofollow noreferrer noopener">Felix's NodeJS Guide 번역본</a></span></b></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"><b style="font-size:9pt;line-height:1.5;">   + <a href="http://blog.doortts.com/253" target="_blank" class="tx-link" style="color:rgb(92,126,159);text-decoration:none;" rel="nofollow noreferrer noopener">Node.js 소개 자료 -여름으로 가는 문</a></b></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"><b>   + <a href="http://visionmedia.github.io/masteringnode/" target="_blank" class="tx-link" style="color:rgb(92,126,159);text-decoration:none;" rel="nofollow noreferrer noopener">Mastering NodeJS</a> (비젼미디어)</b></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"><br /><span style="width:1px;height:1px;float:right;"></span></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">  - <a href="http://javascriptissexy.com/how-to-learn-javascript-properly/" target="_blank" class="tx-link" style="color:rgb(92,126,159);text-decoration:none;" rel="nofollow noreferrer noopener">JavaScript 를 배운다</a> : <b><span style="color:rgb(9,0,255);"><a href="http://bonsaiden.github.io/JavaScript-Garden/ko/" target="_blank" class="tx-link" style="color:rgb(92,126,159);text-decoration:none;" rel="nofollow noreferrer noopener"><span style="color:rgb(9,0,255);">JavaScript Graden 번역본</span></a></span></b></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"><b><br /></b></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">  - 설치 : Professional Node.js 1장 보고 개발환경 셋업</p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">  - 이해 : Beginner Book 보고서 간단히 프로그램들 돌려보기 </p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">  - 모듈 : <a href="http://addyosmani.com/writing-modular-js/" target="_blank" class="tx-link" style="color:rgb(92,126,159);text-decoration:none;" rel="nofollow noreferrer noopener">CommonJS에 대하여 이해하기</a></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">  - <span style="font-size:9pt;line-height:1.5;">Professional Node.js 3장부터 쭉 읽자. 그러면 서버단 개발에 대해서 이해할 수 있다</span></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"><span style="font-size:9pt;line-height:1.5;">  - 우리 목적은 modern web application개발이니 front-end의 <a href="http://javascriptissexy.com/learn-backbone-js-completely/" target="_blank" class="tx-link" style="color:rgb(92,126,159);text-decoration:none;" rel="nofollow noreferrer noopener">backbone.js 를 배운다</a> </span></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"><span style="font-size:9pt;line-height:1.5;"> </span></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"><span style="font-size:9pt;line-height:1.5;"> </span></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"><span style="font-size:9pt;line-height:1.5;"><b><span style="font-size:14pt;">4. Node.js &amp; Backbone.js를 익혔다면 </span></b></span></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"><span style="font-size:9pt;line-height:1.5;">  - </span><a href="http://dailyjs.com/web-app.html" target="_blank" class="tx-link" style="color:rgb(92,126,159);text-decoration:none;" rel="nofollow noreferrer noopener">http://dailyjs.com/web-app.html</a> 여기서 다양한 어플리케이션의 모험을 해보시라</p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">  - 더 나아가서는 템플릿을 위한 Handlebars.js 와 MongoDB를 익힌다</p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"> </p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">  * <b><span style="color:rgb(0,85,255);">2013.2.20 일에 작성한 블로그라서 backbone.js가 나왔다. 이제는 angular.js로 옮겨가는 분위기</span></b></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">    3주를 목표로 잡고 시작하시라~~~ Good Luck!</p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"> </p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"> </p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);"><b><span style="font-size:14pt;">&lt;참조&gt;</span></b></p><p style="color:rgb(46,50,53);font-family:'돋움', Dotum, Verdana, AppleGothic, sans-serif;font-size:13px;background-color:rgb(255,255,255);">  - 원문 : <a href="http://javascriptissexy.com/learn-node-js-completely-and-with-confidence/" target="_blank" class="tx-link" style="color:rgb(92,126,159);text-decoration:none;" rel="nofollow noreferrer noopener">http://javascriptissexy.com/learn-node-js-completely-and-with-confidence/</a></p>]]></description>
<dc:creator>nuno</dc:creator>
<dc:date>2016-12-01T14:02:29+09:00</dc:date>
</item>


<item>
<title>정규표현식 pcre 문법, preg</title>
<link>http://nuno21.net/bbs/board.php?bo_table=php&amp;amp;wr_id=2447</link>
<description><![CDATA[<p>패턴 변경자 </p><p>패턴 변경자 -- 정규표현식 패턴에 존재하는 변경자의 설명 </p><p>설명 </p><p>아래 목록은 현재 존재하는 PCRE 변경자입니다. 괄호 안의 이름은 각 변경자에 대한 PCRE 내부의 이름입니다. </p><p> </p><p> </p><p>i (PCRE_CASELESS) </p><p>이 변경자를 지정하면, 패턴의 문자는 대문자와 소문자를 구별하지 않습니다. </p><p> </p><p>m (PCRE_MULTILINE) </p><p>기본적으로, PCRE는 주어진 문자열을 하나의 "줄"로 취급합니다. (실제로 몇개의 라인을 가지더라도) "줄 시작" 메타문자(^)는 문자열의 처음만을 인식하며, "줄 끝" 메타문자($)는 문자열의 끝이나 (D 변경자가 지정되지 않는 한) 마지막 뉴라인의 직전만을 인식합니다. 이는 펄과 같습니다. </p><p> </p><p>이 변경자를 지정하면, "줄 시작"과 "줄 끝"은 주어진 문자열의 모든 뉴라인 직후와 직전을 인식합니다. respectively, as well as at the very start and end. 이는 펄의 /m 변경자와 동일합니다. 주어진 문자열에 "n" 문자가 존재하지 않거나 ^나 $ 패턴이 일어나지 않으면 이 변경자는 아무런 효과가 없습니다. </p><p> </p><p>s (PCRE_DOTALL) </p><p>이 변경자가 지정되면, 패턴의 점 메타문자는 뉴라인을 포함하는 모든 문자를 인식합니다. 지정하지 않으면, 뉴라인은 제외됩니다. 이 변경자는 펄의 /s 변경자와 동일합니다. [^a]와 같은 부정클래스는 이 변경자에 관계 없이 항상 뉴라인 문자를 포함합니다. </p><p> </p><p>x (PCRE_EXTENDED) </p><p>이 변경자가 지정되면, 공백 문자는 이스케이프 되거나 문자 클래스 안에 있을 경우를 제외하고, 완전히 무시합니다. 문자 클래스 밖에서 이스케이프 되지 않은 # 사이와 뉴라인 문자 다음의 문자도 무시합니다. 이는 펄의 /x 변경자와 같고, 복잡한 패턴 안에 코멘트를 사용할 수 있게 합니다. 그러나 이는 데이터 문자에만 해당하는 점에 주의하십시오. 공백 문자는 패턴의 특별한 문자 시퀀스 안에는 존재할 수 없습니다. 예를 들면, 조건 서브 패턴을 나타내는 (?( 시퀀스에는 나와서는 안됩니다. </p><p> </p><p>e </p><p>이 변경자를 지정하면, preg_replace()는 변경할 문자열을 PHP 코드로 처리하고, 그 결과를 검색된 문자열의 이용하여 일반적인 치환을 합니다. </p><p> </p><p>preg_replace()만 이 변경자를 사용합니다; 다른 PCRE 함수는 무시합니다. </p><p> </p><p>참고: 이 변경자는 PHP 3에서는 사용할 수 없습니다. </p><p> </p><p> </p><p>A (PCRE_ANCHORED) </p><p>이 변경자를 지정하면, 패턴을 강제적으로 "고정"합니다. 이는 ("주어진 문자열"에서) 검색된 문자열의 시작에만 매치도록 강제합니다. 패턴 자체에서 특정한 구조를 가지게 하는, 펄에서는 유일한 방법으로 같은 효과를 얻을 수 있습니다. </p><p> </p><p>D (PCRE_DOLLAR_ENDONLY) </p><p>이 변경자가 설정되면, 패턴의 달러($) 메타문자는 주어진 문자열의 마지막에만 대응합니다. 이 변경자 없이는, 달러는 마지막 문자가 뉴라인일 경우에는 바로 직전의 문자에도 매칭합니다. (마지막이 아닌 뉴라인은 제외합니다) 이 변경자는 m 변경자가 지정되었을때는 무시됩니다. 펄에는 이 변경자가 존재하지 않습니다. </p><p> </p><p>S </p><p>패턴이 여러번 이용되면, 매칭에 걸리는 시간을 절약하기 위해서 분석에 더 많은 시간을 들일 가치가 있습니다. 이 변경자를 지정하면, 추가 분석을 행합니다. 현 시점에서, 패턴의 분석은 하나의 고정된 시작 문자를 가지지 않는 비고정 패턴에만 유용합니다. </p><p> </p><p>U (PCRE_UNGREEDY) </p><p>이 변경자는 수량 지시의 "greediness"를 뒤집습니다. 그리하여 기본값으로 not greedy하게 합니다. 하지만 "?"가 붙으면 greedy하게 됩니다. 이는 펄과 호환되지 않습니다. 패턴 안에서 (?U) 변경자 설정으로 지정할 수 있습니다. </p><p> </p><p>X (PCRE_EXTRA) </p><p>이 변경자는 펄과 호환되지 않는 PCRE의 추가 기능을 사용하게 합니다. 패턴의 문자와 결합된 백슬래쉬가 특별한 의미를 지니지 않을 경우에 에러를 발생시켜서, 차후에 추가 기능을 위해 예약해둡니다. 기본적으로 펄은, 문자와 결합된 백슬래쉬가 특별한 의미를 지니지 않을 경우에는 글자로 취급합니다. 이 변경자는 다른 기능을 제어하지 않습니다. </p><p> </p><p>u (PCRE_UTF8) </p><p>이 변경자는 펄과 호환되지 않는 PCRE의 추가 기능을 사용하게 합니다. 패턴 문자열을 UTF-8으로 취급합니다. 유닉스에서는 PHP 4.1.0부터, win32에서는 PHP 4.2.3부터 사용할 수 있습니다. </p><p> </p><p> </p><p>/////////////////////////////////////////////////////////////////////////////////////////////</p><p> </p><p>패턴 문법 </p><p>패턴 문법 -- PCRE 정규표현식 문법 설명 </p><p>설명 </p><p>PCRE 라이브러리는 아주 약간의 차이(아래를 참고)를 제외하고, 펄 5와 동일한 구문과 의미를 사용하여 정규표현식 패턴 매칭을 수행하는 함수의 집합입니다. 현재 수행은 펄 5.005에 대응합니다. </p><p> </p><p>펄과의 차이 </p><p>여기에서 설명한 차이는 펄 5.005 기준입니다. </p><p> </p><p> </p><p>PCRE는 다른 문자 집합으로 컴파일할 수 있지만, 기본적으로 공백 문자는 C 라이브러리 함수 isspace()가 인식하는 모든 문자입니다. 보통 isspace()는 스페이스, 폼피드, 줄바꿈, 캐리지 리턴, 수평 탭, 수직 탭을 인식합니다. 펄 5는 공백 문자에 수직 탭을 포함하지 않습니다. 오랜 기간동안 펄 문서의 v 이스케이프는 사실상 인정되지 않았습니다. 그러나 문자 자체는 적어도 5.002까지 공백으로 취급되었으며, 5.004와 5.005는 s에서 인식하지 않습니다. </p><p> </p><p>PCRE는 lookahead 단정에서 반복 횟수를 허용하지 않습니다. 펄은 허용하지만, 생각하는 그대로의 의미를 갖지 않습니다. 예를 들어, (?!a){3}는 다음 세 문자가 "a"가 아닌 것을 의미하지 않습니다. 단지, 다음 문자가 "a"가 아니라는 것을 세번 확인할 뿐입니다. </p><p> </p><p>부정 lookahead 단정 안에서 일어나는 서브패턴 검출을 카운트를 하지만, 시작 위치 벡터에 그 엔트리를 설정하지는 않습니다. 펄은 부정 lookahead 단정이 단 하나의 브랜치를 가지고 있을 경우에 한하여, 그 단정이 매치에 실패(결과적으로 성공)하기 전에 매치한 어떠한 패턴에 대해서만 그에 대한 숫자 변수를 설정합니다. </p><p> </p><p>바이너리 제로 문자는 목표 문자열에서는 지원하지만, 패턴 문자열에서는 허용하지 않습니다. 패턴은 제로로 종료하는 보통의 C 문자열로 처리하기 때문입니다. 패턴에서 바이너리 제로를 표현하기 위해서는 이스케이프 시퀀스 "\x00"로 사용할 수 있습니다. </p><p> </p><p>다음의 펄 이스케이프 시퀀스는 지원하지 않습니다: l, u, L, U, E, Q. 사실, 이들은 펄의 일반 문자열 핸들링이며, 패턴 매칭 엔진의 부분이 아닙니다. </p><p> </p><p>펄의 G는 싱글 패턴 매치에 적절하지 않기 때문에 지원하지 않습니다. </p><p> </p><p>당연하게도, PCRE는 (?{code}) 구조를 지원하지 않습니다. </p><p> </p><p>패턴의 일부가 반복될 때, 잡아낸 문자열의 설정에 관해서, 펄 5.005_02에서 일부 이상한 동작이 존재합니다. 예를 들어, "aba"에 대해서 패턴 /^(a(b)?)+$/를 매칭하면 $2를 "b" 값으로 설정하지만, "aabbaa"에 대해서 /^(aa(bb)?)+$/를 매칭하면 $2를 설정하지 않습니다. 하지만 패턴을 /^(aa(b(b))?)+$/로 변경하면 $2(와 $3)를 설정합니다. 펄 5.004에서는 $2를 두 경우 모두 설정했으며, PCRE에서도 TRUE입니다. 앞으로 펄이 이 차이를 일관성 있게 변경한다면, PCRE는 그 변경에 따를 것입니다. </p><p> </p><p>또다른 해결되지 않은 모순점은 펄 5.005_02가 패턴 /^(a)?(?(1)a|b)+$/를 문자열 "a"에 매치하지만, PCRE는 하지 않습니다. 그러나 펄과 PCRE 모두 /^(a)?a/를 "a"에 매치하고 $1을 설정하지 않습니다. </p><p> </p><p>PCRE는 펄 정규표현식 기능의 몇가지 확장을 지원합니다: </p><p> </p><p> </p><p>lookbehind 단정은 고정 길이 문자열에만 매치해야하지만, 양자 택일의 lookbehind 단정에서는 다른 길이의 문자열을 매치할 수 있습니다. 펄 5.005에서는 모두 같은 길이를 가질 것을 요구합니다. </p><p> </p><p>PCRE_DOLLAR_ENDONLY를 설정하고 PCRE_MULTILINE를 설정하지 않으면 $ 메타 문자는 문자열의 가장 마지막에만 매치합니다. </p><p> </p><p>PCRE_EXTRA를 설정하면, 백슬래쉬 뒤에 특별한 의미를 가지지 않는 문자의 사용은 실패하게 됩니다. </p><p> </p><p>PCRE_UNGREEDY를 설정하면, 반복 수량어의 greediness가 뒤집어져서, 기본값으로 greedy하지 않게 됩니다. 하지만 뒤에 물음표가 붙으면 greedy하게 됩니다. </p><p> </p><p> </p><p>정규표현식 상세 </p><p>소개 </p><p>아래 설명은 PCRE가 지원하는 정규표현식의 문법과 의미입니다. 정규표현식은 펄 문서 및 많은 책들에 설명이 있으며, 그 중 일부에는 풍부한 예제를 가지고 있습니다. O'Reilly에서 출판한 Jeffrey Friedl의 "Mastering Regular Expressions"(ISBN 1-56592-257-3)는 예제들을 매우 자세하게 다루고 있습니다. 여기의 설명은 레퍼런스 문서에 따릅니다. </p><p> </p><p>정규표현식은 주어진 문자열에 대하여 왼쪽에서 오른쪽으로 매치하는 패턴입니다. 문자열은 패턴으로 준비하고, 목표에서 대응하는 문자열에 매치합니다. 간단한 예로, 패턴 The quick brown fox는 목표 문자열의 동일한 부분에 매치합니다. </p><p> </p><p>메타 문자 </p><p>정규표현식이 강력한 이유는 패턴에 선택과 반복을 포함할 수 있다는 점입니다. 이는 특별한 방법으로 해석하는 메타 문자를 사용하여 패턴에 넣습니다. </p><p> </p><p>메타 문자는 두가지 종류가 존재합니다: 대괄호 안을 제외하고 패턴의 어디에서라도 작동하는 종류와, 대괄호 안에서만 작동하는 종류입니다. 다음은 대괄호 밖에서 사용하는 메타 문자들입니다. </p><p> </p><p> </p><p>여러가지로 사용하는 일반적인 이스케이프 문자 </p><p> </p><p>^ </p><p>목표의 처음 (멀티라인 모드에서는 줄의 처음) </p><p> </p><p>$ </p><p>목표의 마지막 (멀티라인 모드에서는 줄의 끝) </p><p> </p><p>. </p><p>(기본값으로) 줄바꿈을 제외한 아무 문자 </p><p> </p><p>[ </p><p>클래스 정의 시작 문자 </p><p> </p><p>] </p><p>클래스 정의 끝 문자 </p><p> </p><p>| </p><p>선택 브랜치 시작 </p><p> </p><p>( </p><p>서브패턴 시작 </p><p> </p><p>) </p><p>서브패턴 끝 </p><p> </p><p>? </p><p>( 의미 확장, 또는 0회나 1회, 또는 수량어 minimizer </p><p> </p><p>* </p><p>0회 이상의 횟수 </p><p> </p><p>+ </p><p>1회 이상의 횟수 </p><p> </p><p>{ </p><p>최소/최대 횟수 시작 </p><p> </p><p>} </p><p>최소/최대 횟수 끝 </p><p> </p><p>대괄호 안쪽의 패턴은 "문자 클래스"라고 부릅니다. 다음은 문자 클래스에서 사용하는 메타 문자들입니다: </p><p> </p><p> </p><p>일반적인 이스케이프 문자 </p><p> </p><p>^ </p><p>처음 문자로 올 때, 부정 클래스로 설정 </p><p> </p><p>- </p><p>문자 범위 지정 </p><p> </p><p>] </p><p>문자 클래스 종료 </p><p> </p><p>다음 섹션은 각 메타 문자의 사용을 설명합니다. </p><p> </p><p>백슬래쉬 </p><p>백슬래쉬 문자는 여러가지 사용법을 가집니다. 먼저, 뒤에 영숫자가 아닌 문자가 붙는다면, 그 문자가 가지고 있는 특별한 의미가 사라집니다. 이러한 이스케이프 문자로 백슬래쉬를 사용하는 것은 문자 클래스 안과 밖 양쪽에 모두 적용됩니다. </p><p> </p><p>예를 들어, "*" 문자를 매치하길 원한다면, 패턴에는 "*"로 써야합니다. 이는 따라오는 문자가 메타 문자이던 아니던간에 관계 없이 적용하기 &amp;#46468;문에, 영숫자가 아닌 문자에 그 자체를 사용하기 위해 ""를 붙이는 것이 항상 안전합니다. 특히, 백슬래쉬를 매치하고자 한다면, "\"로 써야합니다. </p><p> </p><p>패턴에 PCRE_EXTENDED 옵션을 사용하면, 패턴에 존재하는 (문자 클래스 안이 아닌) 공백, 그리고 문자 클래스 밖의 "#"사이의 문자와 바로 뒤의 줄바꿈 문자를 무시합니다. 이스케이프하는 백슬래쉬를 공백이나 "#"문자를 패턴에 넣기 위해 사용할 수 있습니다. </p><p> </p><p>백슬래쉬의 두번째 사용법은 패턴에서 출력할 수 없는 문자를 보여지게 인코딩하는 방법을 제공합니다. 바이너리 제로가 패턴 종료를 의미하는걸 제외하면, 출력할 수 없는 문자가 나타나는 제한은 존재하지 않습니다. 그러나 패턴을 텍스트 편집으로 준비할 때는, 다음의 이스케이프 시퀀스를 사용하는 편이 바이너리 문자를 직접 표현하는 것보다 간편합니다: </p><p> </p><p> </p><p>a </p><p>알람, BEL 문자(hex 07) </p><p> </p><p>cx </p><p>"control-x", x는 임의의 문자 </p><p> </p><p>e </p><p>이스케이프 (hex 1B) </p><p> </p><p>f </p><p>폼피드 (hex 0C) </p><p> </p><p>n </p><p>줄바꿈 (hex 0A) </p><p> </p><p>r </p><p>캐리지 리턴 (hex 0D) </p><p> </p><p>t </p><p>탭 (hex 09) </p><p> </p><p>xhh </p><p>16진 코드 hh 문자 </p><p> </p><p>ddd </p><p>8진 코드 ddd 문자, 혹은 역참조 </p><p> </p><p> </p><p>"cx"의 효과는 다음과 같이 계산합니다: "x"가 소문자라면, 대문자로 변환합니다. 그 후, 문자의 6번째 비트(hex 40)가 뒤집어집니다. 즉 "cz"은 hex 1A가 되고, "c{"은 hex 3B, 그리고 "c;"은 hex 7B가 됩니다. </p><p> </p><p>"x" 뒤에, 두개의 16진 숫자를 읽습니다. (대소문자는 구별하지 않습니다) </p><p> </p><p>""은 다음의 두자리의 8진수를 읽습니다. 양쪽 모두, 두자리가 되지 않을 경우, 그 표현을 그대로 사용합니다. 즉 "x7" 시퀀스는 두개의 바이너리 제로에 이어지는 BEL 문자를 정의합니다. 바로 뒤에 8진수로 인식되는 문자가 이어질 경우에는 처음의 제로 뒤에 두자리 수를 써야한다는 것을 잊지 마십시오. </p><p> </p><p>백슬래쉬 뒤에 0이 아닌 수가 올 경우에 혼동할 수 있습니다. 문자 클래스 밖에서, PCRE는 그것과 따라오는 수를 10진수로 읽습니다. 수가 10보다 작거나, 표현식에서 수 이상의 묶음을 잡아냈다면, 이 시퀀스는 역참조가 됩니다. 이 작동에 관해서는 아래에, 묶음 서브패턴에 설명이 있습니다. </p><p> </p><p>문자 클래스 안이나, 10진수 9 이상이 없고 서브패턴이 그만큼 존재하지 않을 경우, PCRE는 백슬래쉬 뒤의 세자리 8진수로 다시 읽어들여, 해당하는 8비트 값으로 하나의 바이트를 생성합니다. 어떠한 수라도 사용할 수 있습니다. 예를 들면: </p><p> </p><p> </p><p>40 </p><p>스페이스의 다른 표현 방법 </p><p> </p><p>40 </p><p>40개 미만의 서브 패턴을 검출하였을때, 동일한 의미 </p><p> </p><p>7 </p><p>항상 역참조 </p><p> </p><p>11 </p><p>역참조, 혹은 탭의 다른 표현 방법 </p><p> </p><p>11 </p><p>항상 탭 </p><p> </p><p>113 </p><p>문자 "3"이 따라오는 탭 </p><p> </p><p>113 </p><p>8진 코드 113 문자 (역참조는 99까지입니다) </p><p> </p><p>377 </p><p>1비트만을 제외한 바이트 </p><p> </p><p>81 </p><p>역참조이거나 "8"과 "1"의 두 문자가 붙는 바이너리 제로 </p><p> </p><p> </p><p>100이상의 8진 값은 앞에 제로가 붙지 않아야만 합니다. 세자리를 넘어가는 8진 값은 읽지 않습니다. </p><p> </p><p>하나의 바이트값을 정의하는 모든 시퀀스는 문자 클래스 내외, 어디에서도 사용할 수 있습니다. 추가로, 문자 클래스 안에서 "b" 시퀀스는 백스페이스 문자(hex 08)로 해석합니다. 문자 클래스 밖에서는 다른 의미를 가집니다. (아래를 참고) </p><p> </p><p>백슬래쉬의 세번째 사용법은 일반적인 문자 타입의 지정입니다: </p><p> </p><p> </p><p>d </p><p>임의의 10진 숫자 </p><p> </p><p>D </p><p>10진 숫자가 아닌 임의의 문자 </p><p> </p><p>s </p><p>임의의 공백 문자 </p><p> </p><p>S </p><p>공백이 아닌 임의의 문자 </p><p> </p><p>w </p><p>임의의 "word" 문자 </p><p> </p><p>W </p><p>임의의 "non-word" 문자 </p><p> </p><p> </p><p>각 이스케이프 시퀀스 조합은 완전한 문자 세트를 두개의 개별 세트로 분리합니다. 주어진 문자는 각 조합의 한쪽에만 매치합니다. </p><p> </p><p>"word" 문자는 어떠한 문자나 숫자, 혹은 언더스코어(_)입니다. 즉, 펄의 "word"에 해당하는 어떠한 문자입니다. 문자와 숫자의 정의는 PCRE의 문자 테이블이 제어하고, 로케일 특정 매칭이 존재할 경우에는 다양할 수 있습니다. (위쪽의 "로케일 지원" 참고) 예를 들어, "fr"(프랑스어) 로케일에서는, 128 이상의 몇몇 코드를 엑센트 문자를 나타내는데 사용하며, 이들은 w에 매치합니다. </p><p> </p><p>문자형 시퀀스는 문자 클래스 안과 밖에서 모두 사용할 수 있습니다. 각각 해당하는 형의 한 문자에 매치합니다. 현재 매칭 위치가 목표 문자열의 마지막이라면, 전부 실패하고, 어떠한 문자도 매치하지 않습니다. </p><p> </p><p>백슬래쉬의 네번째 사용법은 간단한 단정입니다. 단정은 조건이 목표 문자열에서 다른 부분에 매치하지 않고, 특정한 위치에만 매치하도록 지정합니다. 복잡한 단정을 위한 서브패턴의 사용법은 아래에 설명이 있습니다. 백슬래쉬 단정은 다음과 같습니다. </p><p> </p><p> </p><p>b </p><p>word 경계 </p><p> </p><p>B </p><p>word 경계가 아님 </p><p> </p><p>A </p><p>목표의 처음 (멀티라인 모드와 무관) </p><p> </p><p>Z </p><p>목표의 마지막이나 마지막에서 줄바꿈 (멀티라인 모드와 무관) </p><p> </p><p>z </p><p>목표의 마지막 (멀티라인 모드와 무관) </p><p> </p><p> </p><p>단정은 문자 클래스 안에서 사용할 수 없습니다. ("b"가 문자 클래스 안에서는 백스페이스 문자를 나타내는 점에 주의하십시오) </p><p> </p><p>word 경계는 현재 문자와 이전 문자가 둘 다 w에 매치하지 않거나 둘 다 W에 매치하지 않는 (즉, 하나는 w에 매치하고 다른 하나는 W에 매치) 목표 문자열의 위치이거나, 처음이나 마지막 문자가 w에 매치할 경우는 문자열의 처음이나 마지막입니다. </p><p> </p><p>A, Z, z 단정은 전통적인 circumflex와 달러와는 달리 옵션과 관계 없이 목표 문자열의 가장 처음이나 가장 마지막에만 매치합니다. 이들은 PCRE_MULTILINE이나 PCRE_DOLLAR_ENDONLU 옵션에 영향을 받지 않습니다. Z와 z의 차이는, Z가 문자열의 마지막뿐만 아니라 문자열 마지막 문자가 줄바꿈일 경우에는 바로 앞에도 매치하지만, z는 마지막에만 매치합니다. </p><p> </p><p>Circumflex와 달러 </p><p>문자열 클래스의 밖, 기본 매칭 모드에서는 circumflex 문자는 현재 매칭 위치가 목표 문자열의 시작일 경우에만 성공하는 단정입니다. 문자열 클래스 안에서 cicumflex는 완전히 다른 의미를 가집니다. (아래 참고) </p><p> </p><p>여러 개의 선택을 가질 경우 circumflex는 패턴의 처음 문자일 필요가 없지만, 패턴이 그 브랜치에 처음 매치할 경우를 나타내는 각 선택에서의 처음 문자여야 합니다. 모든 선택이 circumflex로 시작하는, 목표의 처음에만 매치하는 패턴은 "고정" 패턴이라 불려집니다. (패턴을 고정하는 다른 구조도 존재합니다) </p><p> </p><p>달러 문자는 매칭 위치가 목표 문자열의 마지막이거나, (기본값으로) 문자열 마지막 줄바꿈의 바로 전에 해당하는 경우에만 TRUE인 단정입니다. 선택을 가지는 패턴에서는 달러가 패턴의 마지막일 필요가 없지만, 마지막을 나타내는 모든 브랜치에서 마지막 문자여야 합니다. 달러는 문자 클래스 안에서는 특별한 의미를 가지지 않습니다. </p><p> </p><p>달러의 의미는 컴파일시나 매치를 할 때 PCRE_DOLLAR_ENDONLY 옵션을 설정해서 문자열의 마지막에만 매치하도록 변경할 수 있습니다. 이는 Z 단정에는 영향을 주지 않습니다. </p><p> </p><p>PCRE_MULTILINE 옵션을 설정하면, circumflex와 달러 문자의 의미가 달라집니다. 이 경우, 목표 문자열의 처음과 마지막에 더하여, 내부의 "n" 문자의 뒤와 앞에도 매치합니다. 예를 들어, 패턴 /^abc$/는 멀티라인 모드에서는 목표 문자열 "defnabc"에 매치하지만, 그렇지 않다면 매치하지 않습니다. 따라서, 모든 브랜치가 "^"로 시작하는 브랜치는 단일라인 모드에서는 고정이지만, 멀티라인 모드에서는 고정이 아닙니다. PCRE_MULTILINE을 설정하면, PCRE_DOLLOR_ENDONLY 옵션을 무시합니다. </p><p> </p><p>어떤 모드에서라도 A, Z, z 시퀀스는 목표의 처음과 마지막에 매치할 때 사용할 수 있습니다. PCRE_MULTILINE에 관계 없이 모든 브랜치가 A로 시작하는 패턴은 항상 고정입니다. </p><p> </p><p>마침표 </p><p>문자 클래스 밖에서, 패턴의 마침표는 패턴의 아무 문자에 매치합니다. 출력할 수 없는 문자도 포함하지만, (기본값으로) 줄바꿈은 포함하지 않습니다. PCRE_DOTALL 옵션을 설정하면, 마침표가 줄바꿈에도 매치합니다. 마침표의 처리는 circumflex와 달러의 처리와는 완전히 독립이며, 유일한 관계는 두 경우 모두 줄바꿈 문자에 해당한다는 점입니다. 마침표는 문자 클래스 안에서는 특별한 의미를 가지지 않습니다. </p><p> </p><p>대괄호 </p><p>여는 대괄호로 문자 클래스를 시작하고, 닫는 대괄호로 종료합니다. 닫는 대괄호는 그 자체로는 특별한 의미가 없습니다. 닫는 대괄호를 클래스의 멤버로 사용하려면 클래스의 가장 처음(존재한다면 시작 circumflex 뒤에)에 위치하거나 백슬래쉬로 이스케이프해야 합니다. </p><p> </p><p>문자 클래스는 목표에서 하나의 문자에 매치합니다; 그 문자는 클래스가 정의하는 문자 세트에 존재해야 합니다. 클래스가 circumflex로 시작할 경우에는, 목표 문자는 클래스 정의 세트에 존재하지 않아야 합니다. circumflex가 클래스 멤버로 필요할 때는, 처음에 위치시키지 않거나 백슬래쉬로 이스케이프해야 합니다. </p><p> </p><p>예를 들면, 문자 클래스 [aeiou]는 모든 소문자 모음에 매치하지만, [^aeiow]는 소문자 모음이 아닌 모든 문자에 매치합니다. circumflex는 단지 클래스에 존재하는 문자가 아닌 것들을 지정하는 편리한 방법일 뿐이라는 점에 주의하십시오. 단정이 아닙니다: 목표 문자열에서 문자를 찾아내며, 현재 위치가 문자열의 끝이면 실패합니다. </p><p> </p><p>대소문자를 구별하지 않는 매칭을 설정하면, 클래스 안의 모든 문자는 대문자와 소문자 모두 매치합니다. 예를 들면, 대소문자 구별 없는 [aeiou]는 "a"와 함께 "A"도 매치하며, 대소문자 구별 없는 [^aeiou]는 구별하는 버전일 경우 매치하는 "A"에는 매치하지 않습니다. </p><p> </p><p>줄바꿈 문자는 PCRE_DOTALL나 PCRE_MULTILINE 옵션의 설정에 관계 없이, 문자 클래스 안에서 특별한 방법으로 취급하지 않습니다. [^a]와 같은 클래스는 항상 줄바꿈에 매치합니다. </p><p> </p><p>빼기(하이픈) 문자는 문자 클래스에서 문자의 범위를 지정하는데 사용할 수 있습니다. 예를 들어, [d-m]은 d부터 m까지의 모든 문자에 매치합니다. 빼기 문자가 클래스에서 필요하면, 백슬래쉬로 이스케이프하거나, 클래스의 맨 처음이나 마지막처럼 범위로 해석할 수 없는 위치에 나타나야 합니다. </p><p> </p><p>문자 "]"를 범위의 마지막으로 지정하는 것은 불가능합니다. [W-]46]과 같은 패턴은 두 문자를 가지는 클래스("W"와 "-") 뒤에 일반 문자열 "46]"이 붙는 형태로 해석합니다. 그러므로 "W46]"이나 "-46]"에 매치합니다. 그러나, "]"를 백슬래쉬로 이스케이프하면 범위의 끝으로 해석하기에, [W-]46]은 범위와 두개의 개별 문자를 가지는 하나의 클래스로 해석합니다. 범위의 마지막으로 "]"의 8진수 및 16진수 표현을 사용할 수도 있습니다. </p><p> </p><p>범위는 아스키 순서에 따라 정해집니다. [00-37]처럼 숫자로 지정한 문자를 사용할 수도 있습니다. 대소문자 구별 없는 매칭을 설정하면, 범위 안의 문자들도 대소문자 구별 없이 매칭합니다. 예를 들면, [W-c]는 대소문자 구별 없는 [][^_`wxyzabc]와 동일하며, "fr" 로케일의 문자표를 사용하면, [xc8-xcb]는 대소문자 구별 없이 엑센트 E 문자에 매치합니다. </p><p> </p><p>문자형 d, D, s, S, w, W도 문자 클래스에서 사용할 수 있고, 해당하는 문자들을 클래스에 추가합니다. 예를 들어, [dABCDEF]는 모든 16진수에 매치합니다. circumflex와 위에서 대문자형을 지정하여 소문자형을 매칭하는 데에 편리하게 제한을 할 수 있습니다. 예를 들어, 클래스 [^W_]는 언더스코어를 제외한 모든 문자와 숫자에 매치합니다. </p><p> </p><p>, -, ^(시작 위치), 종료 ]를 제외한 모든 영숫자가 아닌 문자는 문자 클래스에서 특별한 의미를 가지지 않지만, 이스케이프 해도 문제가 발생하지는 않습니다. </p><p> </p><p>수직 바 </p><p>수직 바 문자는 선택 패턴을 구별할 때 사용합니다. 예를 들어, 패턴 gilbert|sullivan은 "gilbert"나 "sullivan"에 매치합니다. 어떠한 수의 선택도 사용할 수 있고, 빈 선택도 허용합니다. (빈 문자열에 매칭합니다) 매칭 프로세스는 각 선택을 왼쪽에서 오른쪽으로 시도하며, 가장 먼저 선택한 것을 사용합니다. 서브패턴(아래에서 정의) 안에서 선택을 하면, "성공"은 서브패턴의 선택과 함께 메인 패턴의 나머지 부분도 매치하는 것을 의미합니다. </p><p> </p><p>내부 옵션 설정 </p><p>PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, PCRE_EXTENDED의 설정은 "(?"와 ")" 사이에 펄 옵션 문자 시퀀스로 패턴 안에서 변경할 수 있습니다. 옵션 문자는 다음과 같습니다. </p><p> </p><p>표 1. 내부 옵션 문자</p><p> </p><p>i PCRE_CASELESS에 해당   </p><p>m PCRE_MULTILINE에 해당   </p><p>s PCRE_DOTALL에 해당   </p><p>i PCRE_EXTENDED에 해당  </p><p> </p><p> </p><p>예를 들어, (?im)은 대소문자 구별 없는 멀티라인 매칭을 설정합니다. 하이픈과 함께 사용하여 옵션을 해제할 수도 있습니다. 설정과 해제를 동시에 하는 것도 허용합니다. (?im-sx)를 지정하면, PCRE_CASELESS와 PCRE_MULTILINE를 설정하고 PCRE_DOTALL와 PCRE_EXTENDED를 해제합니다. 문자가 하이픈 앞과 뒤에 모두 나타나면, 옵션을 해제합니다. </p><p> </p><p>옵션이 미치는 위치는 패턴의 어디에서 설정을 했는지에 의존합니다. 모든 서브패턴(아래에서 정의) 밖에서 설정하면, 효과는 옵션을 매칭 시작 지점에서 설정 및 해제한 것과 같습니다. 다음 패턴들은 모두 완전히 동일한 작동을 합니다: </p><p> </p><p> </p><p>      (?i)abc </p><p>      a(?i)bc </p><p>      ab(?i)c </p><p>      abc(?i) </p><p>     </p><p> </p><p>이들은 PCRE_CASELESS를 설정하여 패턴 abc를 처리하는 것과 동일합니다. 즉, "최고 레벨" 설정은 (서브패턴 안에서 다른 변화를 주지 않는 한) 모든 패턴에 적용합니다. 최고 레벨에서 같은 옵션의 설정이 하나 이상 존재하면, 가장 오른쪽에 나오는 설정을 사용합니다. </p><p> </p><p>서브패턴 안에서 옵션을 변경하면, 효과가 다릅니다. 이는 펄 5.005에서 작동 변경점입니다. 서브패턴 안에서 옵션 변경은 따라오는 서브패턴의 부분에만 영향을 미칩니다. 그러므로 (a(?i)b)c은 abc와 aBc만을 매치합니다. (PCRE_CASELESS를 사용하지 않는 경우) 이 의미로, 옵션을 패턴의 다른 부분에서 다른 설정으로 할 수 있습니다. 하나의 선택에서 변경한 것은 같은 서브패턴에서 지속적으로 사용합니다. 예를 들면, (a(?i)b|c)는 "ab", "aB", "c", "C"에 매치합니다. "C"는 옵션을 설정하기 전에 나누어진 브랜치에 해당하지만, 이상한 동작일지라도, 처리 시에 옵션 설정의 효율성을 위해서 매치합니다. </p><p> </p><p>PCRE 전용 옵션 PCRE_UNGREEDY와 PCRE_EXTRA는 U와 X 문자를 사용하여 펄 호환 옵션과 같은 방법으로 변경할 수 있습니다. (?X) 플래그는 특별하기에, 최고 레벨에서라도 다른 기능을 켜기 전에 위치해야만 합니다. 가장 처음에 놓는 편이 좋습니다. </p><p> </p><p>서브패턴 </p><p>서브패턴은 괄호로 구분하며, 중첩할 수 있습니다. 패턴의 부분을 서브패턴으로 만드는 것은 두가지 일을 합니다: </p><p> </p><p>1. 선택 세트를 지역화합니다. 예를 들어, 패턴 cat(aract|erpillar|)는 "cat", "cataract", "caterpillar" 중에 하나에 매치합니다. 괄호가 없으면, "cataract", "erpillar", 또는 빈 문자열에 매치할 것입니다. </p><p> </p><p>2. It sets up the subpattern as a capturing subpattern (as defined above). When the whole pattern matches, that portion of the subject string that matched the subpattern is passed back to the caller via the ovector argument of pcre_exec(). Opening parentheses are counted from left to right (starting from 1) to obtain the numbers of the capturing subpatterns. </p><p> </p><p>예를 들어, 문자열 "the red king"이 패턴 the ((read|white) (king|queen)에 매치한다면, "red king", "red", "king" 부분 문자열을 잡아내고, 1, 2, 3의 숫자를 부여합니다. </p><p> </p><p>The fact that plain parentheses fulfil two functions is not always helpful. There are often times when a grouping subpattern is required without a capturing requirement. If an opening parenthesis is followed by "?:", the subpattern does not do any capturing, and is not counted when computing the number of any subsequent capturing subpatterns. For example, if the string "the white queen" is matched against the pattern the ((?:red|white) (king|queen)) the captured substrings are "white queen" and "queen", and are numbered 1 and 2. The maximum number of captured substrings is 99, and the maximum number of all subpatterns, both capturing and non-capturing, is 200. </p><p> </p><p>As a convenient shorthand, if any option settings are required at the start of a non-capturing subpattern, the option letters may appear between the "?" and the ":". Thus the two patterns </p><p> </p><p> </p><p>      (?i:saturday|sunday) </p><p>      (?:(?i)saturday|sunday) </p><p>     </p><p> </p><p>match exactly the same set of strings. Because alternative branches are tried from left to right, and options are not reset until the end of the subpattern is reached, an option setting in one branch does affect subsequent branches, so the above patterns match "SUNDAY" as well as "Saturday". </p><p> </p><p>반복 </p><p>반복은 다음 항목들에 덧붙이는 수량어로 지정합니다: </p><p> </p><p> </p><p>이스케이프할 수 있는 하나의 문자</p><p> </p><p>. 메타 문자</p><p> </p><p>문자 클래스</p><p> </p><p>역참조 (다음 섹션 참고)</p><p> </p><p>서브 패턴 묶음(단정이 아닌 경우 - 아래 참고</p><p> </p><p> </p><p>일반적인 반복 수량어는 허용하는 매치 수의 최소값과 최대값을 중괄호 안에 쉼표로 구분하여 지정합니다. 수는 65535보다 작아야하며, 처음 수는 두번째 수보다 작거나 같아야만 합니다. 예를 들면: z{2,4}는 "zz", "zzz", "zzzz"에 매치합니다. 닫는 괄호 자체는 특수 문자가 아닙니다. 두번째 수를 생략하고, 쉼표가 존재하면 최대 제한이 없어집니다; 두번째 수와 쉼표를 모두 생략하면, 수량어는 요구하는 매치 수의 정확한 수를 지정합니다. 그러므로, [aeiou]{3,}는 3개 이상의 모음에 매치하지만, d{8}은 8자리 수에만 매치합니다. 수량어를 허용하지 않는 위치에서 중괄호를 여는 것은 수량어 구문으로 매치하지 않고, 일반 문자로 취급합니다. 예를 들어, {,6}는 수량어가 아닌, 4 문자의 일반 문자열입니다. </p><p> </p><p>수량어 {0}을 허용하며, 이는 이전의 항목과 수량어가 존재하지 않는 표현식으로 작동합니다. </p><p> </p><p>편의성을 위해서 (그리고 역사적인 호환성을 위해서) 가장 일반적인 세 수량어는 단일 표현을 가지고 있습니다: </p><p> </p><p>표 2. 단일 문자 수량어</p><p> </p><p>* {0,}과 동일  </p><p>+ {1,}과 동일  </p><p>? {0,1}과 동일</p><p> </p><p> </p><p> </p><p>나중에 책이 없을때 필요할지 몰라 따로 정리해놓았다.</p><p> </p><p> </p><p> </p><p>.  : 모든 문자와 일치</p><p> </p><p>| : 왼쪽 혹은 오른쪽과 일치</p><p> </p><p>[] : 문자 집합 구성원 중 하나와 일치</p><p> </p><p>[^] : 문자 집합 구성원을 제외하고 일치</p><p> </p><p>- : 범위 정의([A-Z]와 같은 형태)</p><p> </p><p>\ : 다음에 오는 문자를 이스케이프</p><p> </p><p> </p><p> </p><p>* : 문자가 없는 경우나 하나 이상 연속하는 문자 찾기</p><p> </p><p>*? : 게으른 * 문자</p><p> </p><p>+ : 문자 하나 이상 찾기</p><p> </p><p>+? : 게으른 + 문자</p><p> </p><p>? : 문자가 없거나 하나인 문자 찾기</p><p> </p><p>{n} : 정확히 요소와 n번 일치</p><p> </p><p>{m,n} : 요소와 m번에서 n번 일치</p><p> </p><p>{n,} : 요소와 n번 이상 일치</p><p> </p><p>{n,}? : 게으른 {n,}</p><p> </p><p> </p><p> </p><p>^ : 문자열의 시작과 일치</p><p> </p><p>\A : 문자열의 시작과 일치</p><p> </p><p>$ : 문자열의 끝과 일치</p><p> </p><p>\Z : 문자열의 끝과 일치</p><p> </p><p>\&lt; : 단어의 시작과 일치</p><p> </p><p>\&gt; : 단어의 끝과 일치</p><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><p>\b : 단어의 경계와 일치</p><p> </p><p>\B : \b와 반대로 일치</p><p> </p><p> </p><p> </p><p>[\b] : 역스페이스</p><p> </p><p>\c : 제어문자와 일치</p><p> </p><p>\d : 모든 숫자와 일치</p><p> </p><p>\D : \d와 반대</p><p> </p><p>\f : 페이지 넘기기</p><p> </p><p>\n : 줄바꿈</p><p> </p><p>\r : 캐리지리턴</p><p> </p><p>\s : 공백문자와 일치</p><p> </p><p>\t : 탭</p><p> </p><p>\v : 수직탭</p><p> </p><p>\w : 영숫자 문자나 밑줄과 일치</p><p> </p><p>\W : \w와 반대</p><p> </p><p>\x : 16진수 숫자와 일치</p><p> </p><p>\0 : 8진수 숫자와 일치</p><p> </p><p> </p><p> </p><p>() : 하위표현식 정의</p><p> </p><p>\1 : 첫번째 일치한 하위 표현식, 두번째 일치한 하위표현식은 \2</p><p> </p><p>?= : 전방탐색</p><p> </p><p>?&lt;= : 후방탐색</p><p> </p><p>?! : 부정형 전방탐색</p><p> </p><p>?&lt;! : 부정형 후방탐색</p><p> </p><p>?(backreference)true : 조건지정</p><p> </p><p>?(backreference)true|false : else 표현식 조건지정</p><p> </p><p> </p><p> </p><p>\E : \L혹은 \U변환을 끝냄</p><p> </p><p>\I : 다음에 오는 글자를 소문자로 변환</p><p> </p><p>\L : \E를 만날때까지 모든 문자를 소문자로 변환</p><p> </p><p>\u : 다음에 오는 글자를 대문자로 변환</p><p> </p><p>\U : \E를 만날때까지 모든 문자를 대문자로 변환</p><p> </p><p> </p><p> </p><p>(?m) : 다중행 모드</p>]]></description>
<dc:creator>nuno</dc:creator>
<dc:date>2016-11-29T10:44:11+09:00</dc:date>
</item>

</channel>
</rss>
