サンプル・プログラムの実行例
サンプル・プログラム
url2link.php | サンプル・プログラム本体 |
URLで使える文字
URLを正規表現で表す前に、URLで使えるすべての文字の種類を把握しておく必要がある。
URLの書き方は、RFC 1738 Uniform Resource Locators (URL) 【和訳】に定義されている。これによると、
"http(s)://" 以降に記述できる文字は、英数字(大文字・小文字)と記号類(- _ . ! ~ * ' ( ) ; / ? : @ & = + $ , % #)であることがわかる。
これを正規表現で表すと、
URLの書き方は、RFC 1738 Uniform Resource Locators (URL) 【和訳】に定義されている。これによると、
"http(s)://" 以降に記述できる文字は、英数字(大文字・小文字)と記号類(- _ . ! ~ * ' ( ) ; / ? : @ & = + $ , % #)であることがわかる。
これを正規表現で表すと、
/https?\:\/\/[\-_\.\!\~\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#]+/iとなる。順に説明していこう。
今回使った正規表現
- ?
- 直前1文字の0または1回の繰り返し。
ここでは、httpとhttps の両方にマッチする。
- [...]
- 文字クラス。 この中に記述された文字の並びのうちの1文字を表す。
- -
- 文字の範囲指定。
a-z はアルファベット小文字すべてに、A-Zはアルファベット大文字すべてに、0-9は数字すべてにマッチする。
- +
- 直線1文字の1回以上の繰り返し。 ここでは、文字クラス[...]に記述された文字、いずれかの1回以上の繰り返し――すなわち、URL 文字列にマッチすることになる。
- (...)
- サブパターン。 マッチングだけであれば不要だが、置換を行うために、マッチした部分文字列に番号を付けてやる必要がある。その場合にサブパターンを用いる。
解説:正規表現パターンなど
11: define('INTERNAL_ENCODING', 'UTF-8');
12: mb_internal_encoding(INTERNAL_ENCODING);
13: mb_regex_encoding(INTERNAL_ENCODING);
14: define('MYSELF', basename($_SERVER['SCRIPT_NAME']));
関数 mb_internal_encoding により、内部処理は UTF-8 を指定する。
念のため、関数 mb_regex_encoding により、正規表現処理も UTF-8 を指定しておく。
また、このプログラムは、入力部と出力部を同じファイルで処理するため、formタグの飛び先を自分自身 MYSELF にする。
念のため、関数 mb_regex_encoding により、正規表現処理も UTF-8 を指定しておく。
また、このプログラムは、入力部と出力部を同じファイルで処理するため、formタグの飛び先を自分自身 MYSELF にする。
検索パターンを定数 PATTERN に、置換パターンを定数 REPLACE に、それぞれ設定しておく。
preg系正規表現関数(PCRE)では、マッチしたサブパターンには、順番に ¥1, ¥2, ¥3‥‥という符号が付けられ、置換パターンで置き換えを行うことができる。
preg系正規表現関数(PCRE)では、マッチしたサブパターンには、順番に ¥1, ¥2, ¥3‥‥という符号が付けられ、置換パターンで置き換えを行うことができる。
解説:URLの置換
207: $sour = getParam('sour', TRUE, DEF_SOUR);
208: $sour = htmlspecialchars($sour); //XSS対策
209:
210: //リセット
211: if (isset($_POST['reset'])) {
212: $sour = DEF_SOUR;
213: }
214:
215: //正規表現による置換
216: $dest = preg_replace(PATTERN, REPLACE, $sour);
実際に置換を行うのは、関数 preg_replace である。
また、リセットボタンを押すことで、すべてのエリアをクリアするようにしてある。HTML のリセットボタンではすべてクリアできないので、reset がPOST渡しされたときにPHPでクリアするようにしてある。
また、リセットボタンを押すことで、すべてのエリアをクリアするようにしてある。HTML のリセットボタンではすべてクリアできないので、reset がPOST渡しされたときにPHPでクリアするようにしてある。
(この項おわり)
(2021年7月25日)PHP8対応,リファラ・チェックとコピーボタン追加