PageRenderTime 49ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/php-chunked-xhtml/reference.pcre.pattern.modifiers.html

https://github.com/tsujita/dotfiles
HTML | 309 lines | 254 code | 55 blank | 0 comment | 0 complexity | 737e8865844a26c4cd11c3a35f4706cc MD5 | raw file
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  5. <title>パターン修飾子</title>
  6. </head>
  7. <body><div class="manualnavbar" style="text-align: center;">
  8. <div class="prev" style="text-align: left; float: left;"><a href="pcre.pattern.html">PCRE のパターン</a></div>
  9. <div class="next" style="text-align: right; float: right;"><a href="reference.pcre.pattern.differences.html">Perl とは異なる点</a></div>
  10. <div class="up"><a href="pcre.pattern.html">PCRE のパターン</a></div>
  11. <div class="home"><a href="index.html">PHP Manual</a></div>
  12. </div><hr /><div id="reference.pcre.pattern.modifiers" class="article">
  13. <h1>パターン修飾子</h1>
  14. <p class="para">
  15. 現在使用可能な PCRE 修飾子の一覧を以下に示します
  16. 括弧の中の名前はこれらの修飾子に関する PCRE 内部の名前です
  17. 修飾子中での空白文字および改行は無視されます他の文字はエラーになります
  18. </p>
  19. <p class="para">
  20. <blockquote class="blockquote">
  21. <dl>
  22. <dt>
  23. <span class="term"><em class="emphasis">i</em> (<em>PCRE_CASELESS</em>)</span>
  24. <dd>
  25. <span class="simpara">
  26. この修飾子を設定するとパターンの中の文字は
  27. 大文字にも小文字にもマッチします
  28. </span>
  29. </dd>
  30. </dt>
  31. <dt>
  32. <span class="term"><em class="emphasis">m</em> (<em>PCRE_MULTILINE</em>)</span>
  33. <dd>
  34. <span class="simpara">
  35. デフォルトでPCRE 検索対象文字列を実際には複数行からなる
  36. 場合でも単一の行からなるとして処理します
  37. 行頭メタ文字 (^) 対象文字列の最初にしかマッチしません
  38. 一方行末メタ文字 ($) 文字列の最後または
  39. <em class="emphasis">D</em> 修飾子が設定されていない場合
  40. 最後にある改行記号の前のみにしかマッチしません
  41. この動作は Perl と同じです
  42. </span>
  43. <span class="simpara">
  44. この修飾子を設定すると行頭および行末メタ文字は
  45. 対象文字列において文字列の最初と最後に加えて
  46. 各改行の直前と直後にそれぞれマッチします
  47. この動作はPerl /m 修飾子と同じです
  48. 対象文字列の中に &quot;\n&quot; 文字がない場合や
  49. またはパターンに ^ または $ がない場合は
  50. この修飾子を設定しても意味はありません
  51. </span>
  52. </dd>
  53. </dt>
  54. <dt>
  55. <span class="term"><em class="emphasis">s</em> (<em>PCRE_DOTALL</em>)</span>
  56. <dd>
  57. <span class="simpara">
  58. この修飾子を設定するとパターン中のドットメタ文字は
  59. 改行を含む全ての文字にマッチします
  60. これを設定しない場合は改行にはマッチしません
  61. この修飾子はPerl /s 修飾子と同じです
  62. [^a] のような否定の文字クラスは
  63. この修飾子の設定によらず常に改行文字にマッチします
  64. </span>
  65. </dd>
  66. </dt>
  67. <dt>
  68. <span class="term"><em class="emphasis">x</em> (<em>PCRE_EXTENDED</em>)</span>
  69. <dd>
  70. <span class="simpara">
  71. この修飾子を設定するとエスケープするか
  72. 文字クラスの内部を除き
  73. パターンの空白文字は完全に無視されます
  74. 文字クラスの外にあってかつエスケープされていない #
  75. と次の改行文字の間の文字も無視されます
  76. この動作はPerl /x 修飾子と同じであり複雑なパターンの内部に
  77. コメントを記述することが可能となります
  78. しかしこの修飾子はデータ文字にのみ適用されることに注意
  79. してください空白文字をパターンの特殊文字の並びの中
  80. 例えば条件付きサブパターン (?( の内部に置くことはできません
  81. </span>
  82. </dd>
  83. </dt>
  84. <dt>
  85. <span class="term"><em class="emphasis">e</em> (<em>PREG_REPLACE_EVAL</em>)</span>
  86. <dd>
  87. <div class="warning"><strong class="warning">警告</strong><p class="simpara">この機能は PHP 5.5.0
  88. <em class="emphasis">非推奨</em>になりますこの機能に頼らないことを強く推奨します</p></div>
  89. <span class="simpara">
  90. この修飾子を設定すると <span class="function"><a href="function.preg-replace.html" class="function">preg_replace()</a></span>
  91. 置換文字列において後方参照に関する通常の置換を行った後
  92. PHP コードとして評価し検索文字列を置換するためにその結果を
  93. 使用します
  94. 置換された後方参照においては
  95. 単引用符や二重引用符バックスラッシュ (<em>\</em>)および NULL 文字は
  96. バックスラッシュでエスケープされます
  97. </span>
  98. <div class="caution"><strong class="caution">警告</strong>
  99. <p class="para">
  100. マッチした後方参照ごとに <span class="function"><a href="function.addslashes.html" class="function">addslashes()</a></span> が実行されてから
  101. 置換を行いますつまりクォートした文字列として後方参照を利用した場合
  102. エスケープした文字がリテラルに変換されます
  103. しかしエスケープされた文字については通常は変換されず
  104. スラッシュが残ったままになります
  105. そのためこの修飾子はとても複雑なものになってしまいます
  106. </p>
  107. </div>
  108. <div class="caution"><strong class="caution">警告</strong>
  109. <p class="para">
  110. <em><code class="parameter">replacement</code></em> PHP のコードとして妥当な文字列であることを確認しましょう
  111. そうでない場合は
  112. <span class="function"><a href="function.preg-replace.html" class="function">preg_replace()</a></span> を含む行で PHP のパースエラーが発生します
  113. </p>
  114. </div>
  115. <div class="caution"><strong class="caution">警告</strong>
  116. <p class="para">
  117. この修飾子を使うことは<em class="emphasis">おすすめしません</em>
  118. セキュリティに関する脆弱性を作ってしまいがちだからです
  119. </p>
  120. <div class="informalexample">
  121. <div class="example-contents">
  122. <div class="phpcode"><code><span style="color: #000000">
  123. <span style="color: #0000BB">&lt;?php<br />$html&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'html'</span><span style="color: #007700">];<br /><br /></span><span style="color: #FF8000">//&nbsp;見出しを大文字にします<br /></span><span style="color: #0000BB">$html&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">preg_replace</span><span style="color: #007700">(<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'(&lt;h([1-6])&gt;(.*?)&lt;/h\1&gt;)e'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'"&lt;h$1&gt;"&nbsp;.&nbsp;strtoupper("$2")&nbsp;.&nbsp;"&lt;/h$1&gt;"'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$html<br /></span><span style="color: #007700">);</span>
  124. </span>
  125. </code></div>
  126. </div>
  127. </div>
  128. <p class="para">
  129. このサンプルを攻撃するのは簡単で
  130. <em>&lt;h1&gt;{${eval($_GET[php_code])}}&lt;/h1&gt;</em>
  131. のような文字列を渡すだけで攻略できます
  132. 攻撃者は任意の PHP コードを実行でき
  133. サーバーに対するほぼ完全なアクセス権を与えることになってしまいます
  134. </p>
  135. <p class="para">
  136. この種のリモートコード実行脆弱性を回避するには
  137. <span class="function"><a href="function.preg-replace-callback.html" class="function">preg_replace_callback()</a></span> 関数を使うようにしなければなりません
  138. </p>
  139. <div class="informalexample">
  140. <div class="example-contents">
  141. <div class="phpcode"><code><span style="color: #000000">
  142. <span style="color: #0000BB">&lt;?php<br />$html&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'html'</span><span style="color: #007700">];<br /><br /></span><span style="color: #FF8000">//&nbsp;見出しを大文字にします<br /></span><span style="color: #0000BB">$html&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">preg_replace_callback</span><span style="color: #007700">(<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'(&lt;h([1-6])&gt;(.*?)&lt;/h\1&gt;)'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;(</span><span style="color: #0000BB">$m</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #DD0000">"&lt;h</span><span style="color: #0000BB">$m</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]</span><span style="color: #DD0000">&gt;"&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">strtoupper</span><span style="color: #007700">(</span><span style="color: #0000BB">$m</span><span style="color: #007700">[</span><span style="color: #0000BB">2</span><span style="color: #007700">])&nbsp;.&nbsp;</span><span style="color: #DD0000">"&lt;/h</span><span style="color: #0000BB">$m</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]</span><span style="color: #DD0000">&gt;"</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$html<br /></span><span style="color: #007700">);</span>
  143. </span>
  144. </code></div>
  145. </div>
  146. </div>
  147. </div>
  148. <blockquote class="note"><p><strong class="note">注意</strong>:
  149. <p class="para">
  150. この修飾子を使用するのは <span class="function"><a href="function.preg-replace.html" class="function">preg_replace()</a></span>のみです
  151. 他の PCRE 関数では無視されます
  152. </p>
  153. </p></blockquote>
  154. </dd>
  155. </dt>
  156. <dt>
  157. <span class="term"><em class="emphasis">A</em> (<em>PCRE_ANCHORED</em>)</span>
  158. <dd>
  159. <span class="simpara">
  160. この修飾子を設定するとパターンは強制的に固定 (anchored) となります
  161. つまり検索対象文字列の先頭でのみマッチするように制限されます
  162. パターン自体の中に適当な指定を行うことでも同様の効果を得ることが可能です
  163. Perl ではパターン中に指定する方法しか使用できません
  164. </span>
  165. </dd>
  166. </dt>
  167. <dt>
  168. <span class="term"><em class="emphasis">D</em> (<em>PCRE_DOLLAR_ENDONLY</em>)</span>
  169. <dd>
  170. <span class="simpara">
  171. この修飾子を設定するとパターン内のドルメタ文字は検索対象文字列の
  172. 終わりにのみマッチしますこの修飾子を設定しない場合ドル記号は
  173. 検索対象文字列の最後の文字が改行文字であればその直前にもマッチします
  174. この修飾子は<em class="emphasis">m</em> を設定している場合に無視されます
  175. Perl にはこの修飾子に等価なものはありません
  176. </span>
  177. </dd>
  178. </dt>
  179. <dt>
  180. <span class="term"><em class="emphasis">S</em></span>
  181. <dd>
  182. <span class="simpara">
  183. あるパターンを複数回使用する場合はマッチングにかかる時間を
  184. 高速化することを目的としてパターンの分析に幾分か時間をかけても
  185. 良いでしょうこの修飾子を設定すると追加のパターン分析が
  186. 行われます現在パターン分析は最初の文字が単一ではなく
  187. かつ固定でないパターンに対してのみ有用です
  188. </span>
  189. </dd>
  190. </dt>
  191. <dt>
  192. <span class="term"><em class="emphasis">U</em> (<em>PCRE_UNGREEDY</em>)</span>
  193. <dd>
  194. <span class="simpara">
  195. この修飾子を設定すると量指定子の貪欲さが反転します
  196. つまり量指定子はデフォルトで貪欲でなく
  197. 疑問符を後ろに付けてはじめて貪欲になるようになります
  198. この修飾子は Perl 互換では有りません
  199. 同様の設定は(<em>?U</em>) 修飾子を <a href="regexp.reference.internal-options.html" class="link">パターン内で設定</a>
  200. するか<em>.*?</em> のように量指定子の後に疑問符を
  201. 付けるかすることで行うこともできます
  202. </span>
  203. <blockquote class="note"><p><strong class="note">注意</strong>:
  204. <p class="para">
  205. 通常は非貪欲モードでは <a href="pcre.configuration.html#ini.pcre.backtrack-limit" class="link">pcre.backtrack_limit</a>
  206. 文字を超えるマッチができません
  207. </p>
  208. </p></blockquote>
  209. </dd>
  210. </dt>
  211. <dt>
  212. <span class="term"><em class="emphasis">X</em> (<em>PCRE_EXTRA</em>)</span>
  213. <dd>
  214. <span class="simpara">
  215. この修正子はPerl 非互換な PCRE の機能を有効にします
  216. パターン内で後ろに文字が続くバックスラッシュで特別な意味がないものは
  217. 将来的な拡張の際の互換性の維持のためエラーになります
  218. デフォルトではPerl のように文字が後ろに続くバックスラッシュ
  219. で特に意味がないものはリテラルとして処理されます
  220. この修飾子により制御される機能は現在の所これだけです
  221. </span>
  222. </dd>
  223. </dt>
  224. <dt>
  225. <span class="term"><em class="emphasis">J</em> (<em>PCRE_INFO_JCHANGED</em>)</span>
  226. <dd>
  227. <span class="simpara">
  228. (?J) 内部オプションはローカルのオプション <em>PCRE_DUPNAMES</em> の設定を変更します
  229. サブパターンで重複した名前を使用できるようになります
  230. </span>
  231. </dd>
  232. </dt>
  233. <dt>
  234. <span class="term"><em class="emphasis">u</em> (<em>PCRE_UTF8</em>)</span>
  235. <dd>
  236. <span class="simpara">
  237. この修正子はPerl 非互換な PCRE の機能を有効にしますパターン
  238. 文字列はUTF-8 エンコードされた文字列として処理されます
  239. この修正子はUNIX では PHP 4.1.0 以降Win32 では PHP 4.2.3 以降で
  240. 使用可能です
  241. またPHP 4.3.5 以降ではパターンの UTF-8 としての妥当性も確認されます
  242. </span>
  243. </dd>
  244. </dt>
  245. </dl>
  246. </blockquote>
  247. </p>
  248. </div>
  249. <hr /><div class="manualnavbar" style="text-align: center;">
  250. <div class="prev" style="text-align: left; float: left;"><a href="pcre.pattern.html">PCRE のパターン</a></div>
  251. <div class="next" style="text-align: right; float: right;"><a href="reference.pcre.pattern.differences.html">Perl とは異なる点</a></div>
  252. <div class="up"><a href="pcre.pattern.html">PCRE のパターン</a></div>
  253. <div class="home"><a href="index.html">PHP Manual</a></div>
  254. </div></body></html>