PHP で文字列内から制御文字を削除するサンプルコード。正規表現で制御文字を削っている。


$ cat metachars.php
<?php

$metachars = [
  "tab        " => "\t",
  "newline    " => "\n",
  "back space " => "\x08"
];

echo("そのまま出力\n");
foreach($metachars as $key => $val){
  echo("${key}: AAA${val}BBB\n");
}
echo("\n");

echo("正規表現でPOSIX文字クラスを使って制御文字を削除\n");
foreach($metachars as $key => $val){
  echo(preg_replace('/[[:cntrl:]]/', '', "${key}: AAA${val}BBB") . "\n");
}
echo("\n");

echo("正規表現で否定先読みを使ってタブと改行以外の制御文字を削除\n");
foreach($metachars as $key => $val){
  echo(preg_replace('/(?!(\t|\n))[[:cntrl:]]/', '', "${key}: AAA${val}BBB") ."\n");
}
echo("\n");

実行結果。


$ php metachars.php
そのまま出力
tab        : AAA	BBB
newline    : AAA
BBB
back space : AABBB

正規表現でPOSIX文字クラスを使って制御文字を削除
tab        : AAABBB
newline    : AAABBB
back space : AAABBB

正規表現で否定先読みを使ってタブと改行以外の制御文字を削除
tab        : AAA	BBB
newline    : AAA
BBB
back space : AAABBB

バックスペースの制御文字を野放しにすると、文字列を連結したときに前の文字を削ってしまう。外部からの入力でこんなのがあったら危険なので、必要に応じて削除する必要がある。

今回の環境: Debian GNU/Linux jessie + PHP 5.6


$ uname -mrsv
Linux 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-1 (2016-03-06) x86_64

$ php -v
PHP 5.6.20-0+deb8u1 (cli) (built: Apr 27 2016 11:26:05) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
コンピューティングと電気通信において、制御文字(せいぎょもじ、英語: control character)とは、文字コードの規格で定義される文字のうち、ディスプレイ・プリンター・通信装置などに対して、特別な動作(制御)をさせるために使う文字である。制御キャラクタともいい、情報処理用語規格では「制御機能文字」と呼ばれている。

制御文字 - Wikipedia

tags: php

Posted by NI-Lab. (@nilab)