'팁&테크/ETC'에 해당되는 글 32건
- 2009.03.27 VMware 내부 OS 에 접속하기
- 2008.12.16 레일스 파일(이미지) 업로드 방법들
- 2008.12.16 루비 온 레일스로 파일업로딩
- 2007.10.20 MIME 타입 정리
- 2007.09.14 input에서 영문,숫자,특수문자만 입력받으려 할경우
- 2007.09.14 XML-RPC 관련문서 링크
- 2007.06.29 정규표현식 기초
- 2007.06.29 정규표현식 기초
- 2007.06.29 정규표현식의 기본 문법
- 2007.06.29 Ascii 특수문자
VMware 내부 OS 에 접속하기
Host PC 에서 CentOS에 연결하는 것과 Host PC가 아닌 외부에서 접속하는 두가지 방법을 알아 보겠습니다.
우선 Host PC에서는 별다른 설정없이 CentOS에 할당한 ip 주소로 연결이 가능합니다.
CentOS 를 설치할때 DHCP로 ip를 할당하는 방식을 선택했기때문에 CentOS를 부팅할때마다 ip주소가 바뀔수 있습니다. 그러면 매번 ip를 확인해야 되니깐 아주 번거롭겠지요. 그래서 우선 고정 ip 방식으로 변경해야 합니다.
우선 게이트웨이를 알아야 하는데 VMware 에서 Edit > Virtual Network Editor > NAT 탭을 보시면 Gateway IP address 를 알수 있습니다. 그럼 아이피를 그 대역에 맞게 설정하시면 되겠습니다.
system-config-network 명령을 실행하여 DHCP 로 설정된 부분을 고정아이피로 변경해 줍시다.
DHCP 체크를 해제 하고
ip주소 : 192.168.11.3 (3~255 아무 값이나)
서브넷마스크 : 255.255.255.0
게이트웨이 : 192.168.11.2
라고 입력한 후에 /etc/init.d/network restart 명령으로 네트웍을 재시작 합니다.
자 그럼 외부에서 접속하는 설정은 모두 끝이 났습니다.
그럼 Host PC 에서 VMware 내의 CentOS에 접속하기 위해서는 192.168.11.3 의 주소로 연결하면 되겠습니다.
그럼 이제부터는 외부에서 VMware 내의 CentOS에 접속하는 방법을 알아보도록 하겠습니다.
이방법은 Host PC의 포트를 VMware 의 Port로 포워딩 하는 방법입니다.
간단한 예로 VMware 내의 CentOS 에 ftp로 연결 하려고 한다면 Host PC에 ftp연결을 하면 자동으로 VMware 내의 CentOS ftp로 연결을 해주는 것이지요.
외부PC --------> Host PC ---------> VMware(CentOS)
Edit > Virtual Network Editor 메뉴를 클릭합니다.
NAT 탭에 Edit 버튼을 클릭합니다.
Port Forwarding 을 클릭합니다.
각각 사용할 포트를 포워딩 합니다.
Host Port 는 실제 PC의 포트를 입력하고 아이피주소에는 아이피주소는 아까 입력한 192.168.11.3 을 Port 에는 VMware에 설치한 리눅스에서 연결되는 포트를 입력하지면 됩니다.
예로 ssh로 다른 PC에서 Host PC에 접속을 하게 되면 자동으로 192.168.11.3 의 22번 포트로 연결을 해주게 되는 것입니다. (주의 : Host PC 의 방화벽으로 Port 가 막혀있으면 Port를 풀어주셔야 됩니다.)
정상적으로 접속하는 모습을 보실 수 있습니다.
레일스 파일(이미지) 업로드 방법들
플러그인명 |
특징 |
주요 유스케이스 |
이미지 처리 방식 |
파일 저장소 |
attatchment_fu |
가장 잘 알려지고, 비교적 오래된 업로드 플러그인의 고전 |
파일, 이미지 (범용) |
RMagick ImageScience mini_magic |
파일시스템 Database Amazon S3 |
UploadColumn | 또 하나의 멋진 업로드 플러그인 |
파일, 이미지 (주로 이미지) |
RMagick, ImageScience |
파일시스템 |
PaperClip |
+ 아주 간단한 이미지 전용 플러그인 - (디폴트) 파일시스템이 너무 선형으로 늘어나는 경향이 있음 |
이미지 (Avatar, thumbnail 등 간단한 이미지 업로드에 적합) |
ImageMagick (RMagick 불필요) |
파일시스템 Amazon S3 |
FlexImage |
+ *.flexi 라는 템플릿을 사용하는 독특한 이미지 렌더링 방식을 갖추고 있어서 제목 그대로 아주 유연한 이미지 조작이 가능 + MagicColumn 기능도 멋짐! |
이미지 (특히 이미지에 워터마크를 넣는다거나 기타 ImageMagick을 사용한 여러가지 조작이 필요한 경우에 적당함) |
RMagick |
파일시스템 권장 Database도 가능 |
[출처] http://thinkr.egloos.com/1990365
루비 온 레일스로 파일업로딩
대충 번역했다.
Rails를 이용한 파일업로딩
레일즈 명령어를 이용해 어플리케이션 본체 생성
C:\ruby> rails upload
업로드될 파일의 위치 결정. 이 자료들은 공용 구역에 저장됨
디렉터리를 만들고 퍼미션 체크
C:\ruby> cd upload
C:\ruby> mkdir upload\public\data
다음은 컨트로러와 모델 생성
모델 생성:
DB기반 어플리케이션이 아니기 때문에 아무 이름가능. DataFile 모델로 만듬.
(주:테이블에 대한 1또는 n에 대한 단/복수형 모델명을 지정을 해야되기 때문에..?)
C:\ruby> ruby script/generate model DataFile
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/data_file.rb
create test/unit/data_file_test.rb
create test/fixtures/data_files.yml
create db/migrate
create db/migrate/001_create_data_files.rb
data_file.rb 모델 파일에서 불러질 메소드(액션메소드?)를 생성한다.
이 메소드는 어플리케이션 컨트롤러에서 사용될 것이다.
class DataFile < ActiveRecord::Base
def self.save(upload)
name = upload['datafile'].original_filename
directory = "public/data"
# create the file path
path = File.join(directory, name)
# write the file
File.open(path, "wb") { |f| f.write(upload['datafile'].read) }
end
end
위 함수는 CGI 객체 [업로드]를 받고 업로드된 파일명을 [original_filename] 함수를
이용해서 추출해(extract)주고, "public/data" 디렉터리에 저장될 것이다.
또한 [content_type] 함수를 이용해서 미디어 형식(mime?)을 불러올 수 있다.
여기서 [File]은 루비 객체이고 디렉터리명과 파일명을 합쳐서
전체파일경로(full file path) 를 리턴한다.
그 다음, File 객체에서 제공해주는 함수로 쓰기모드(write mode)로 연다.
또한 읽어진 파일을 출력파일로 쓸 수 있다.
컨트롤러 생성:
업로드용 컨트롤러 생성
C:\ruby> ruby script/generate controller Upload
exists app/controllers/
exists app/helpers/
create app/views/upload
exists test/functional/
create app/controllers/upload_controller.rb
create test/functional/upload_controller_test.rb
create app/helpers/upload_helper.rb
Now we will create two controller functions first function index will call a view file to take user input and second function uploadFile takes file information from the user and passes it to the 'DataFile' model. We set the upload directory to the 'uploads' directory we created earlier "directory = 'data'".
2개의 컨트롤러 함수를 만들건데, 하나는 뷰 파일에서 입력을 받을 [index] 이고,
다른 함수는 [uploadFile]로, 사용자가 DataFile 모델을 통해 올려진 파일의 정보를
얻는 것이다. 앞에서, uploads 디렉터리에 저장하기위해 "directory = data" 로 했다.
class UploadController < ApplicationController
def index
render :file => 'app\views\upload\uploadfile.rhtml'
end
def uploadFile
post = DataFile.save(params[:upload])
render :text => "File has been uploaded successfully"
end
end
불러올 함수를 모델파일에 정의한다. [render] 함수는 view 파일로 메시지를
되돌려서 보여준다.
뷰 생성:
마지막으로 컨트롤러에서 언급한 [uploadfile.rhtml] 뷰 파일을 만든다.
대충 다음처럼..
<h1>File Upload</h1>
<%= start_form_tag ({:action => 'uploadFile'},
:multipart => true) %>
<p><label for="upload_file">Select File</label> :
<%= file_field 'upload', 'datafile' %></p>
<%= submit_tag "Upload" %>
<%= end_form_tag %>
여기까지가 설명한 모든 것들이다.
새로운 태그는 [file_field] 뿐이고, 이는 사용자의 컴퓨터에서 파일을 찾을 수 있는
버튼을 만들어준다.
multipart 파라미터를 참(true)로 설정하면, 파일을 binary file 형식으로 바로
인식한다.
여기서 중요한 것은 :action 에 메소드이름을 [uploadFile] 으로 업로드 버튼을 누르면
호출하기 위해서 지정한 것이다.
이는 다음화면처럼 보여준다.
[http://www.tutorialspoint.com/images/upload-file.gif]
업로드하면 app/public/data 디렉터리에 실제 파일명으로 저장되고 메시지가 보여진다.
NOTE: 디렉터리에 같은 파일명이 이미 존재하면 덮어쓸 것이다.
------------------------------------
대충 번역은 여기까지..
------------------------------------
Files uploaded from Internet Explorer:
Internet Explorer includes the entire path of a file in the filename sent, so the original_filename routine will return something like:
Files uploaded from Internet Explorer:
Internet Explorer includes the entire path of a file in the filename sent, so the original_filename routine will return something like:
C:\Documents and Files\user_name\Pictures\My File.jpg
instead of just:
My File.jpg
This is easily handled by File.basename, which strips out everything before the filename.
def sanitize_filename(file_name)
# get only the filename, not the whole path (from IE)
just_filename = File.basename(file_name)
# replace all none alphanumeric, underscore or perioids
# with underscore
just_filename.sub(/[^\w\.\-]/,'_')
end
Deleting an existing File:
If you want to delete any existing file then its simple and need to write following code:
def cleanup
File.delete("#{RAILS_ROOT}/dirname/#{@filename}")
if File.exist?("#{RAILS_ROOT}/dirname/#{@filename}")
end
For a complete detail on File object, you need to go through Ruby Reference Manual.
[출처] http://guyv.tistory.com/201
MIME 타입 정리
컨텐트 형식으로 본 MIME Type
Type/sub-type | Extension |
---|---|
application/envoy | evy |
application/fractals | fif |
application/futuresplash | spl |
application/hta | hta |
application/internet-property-stream | acx |
application/mac-binhex40 | hqx |
application/msword | doc |
application/msword | dot |
application/octet-stream | * |
application/octet-stream | bin |
application/octet-stream | class |
application/octet-stream | dms |
application/octet-stream | exe |
application/octet-stream | lha |
application/octet-stream | lzh |
application/oda | oda |
application/olescript | axs |
application/pdf | |
application/pics-rules | prf |
application/pkcs10 | p10 |
application/pkix-crl | crl |
application/postscript | ai |
application/postscript | eps |
application/postscript | ps |
application/rtf | rtf |
application/set-payment-initiation | setpay |
application/set-registration-initiation | setreg |
application/vnd.ms-excel | xla |
application/vnd.ms-excel | xlc |
application/vnd.ms-excel | xlm |
application/vnd.ms-excel | xls |
application/vnd.ms-excel | xlt |
application/vnd.ms-excel | xlw |
application/vnd.ms-outlook | msg |
application/vnd.ms-pkicertstore | sst |
application/vnd.ms-pkiseccat | cat |
application/vnd.ms-pkistl | stl |
application/vnd.ms-powerpoint | pot |
application/vnd.ms-powerpoint | pps |
application/vnd.ms-powerpoint | ppt |
application/vnd.ms-project | mpp |
application/vnd.ms-works | wcm |
application/vnd.ms-works | wdb |
application/vnd.ms-works | wks |
application/vnd.ms-works | wps |
application/winhlp | hlp |
application/x-bcpio | bcpio |
application/x-cdf | cdf |
application/x-compress | z |
application/x-compressed | tgz |
application/x-cpio | cpio |
application/x-csh | csh |
application/x-director | dcr |
application/x-director | dir |
application/x-director | dxr |
application/x-dvi | dvi |
application/x-gtar | gtar |
application/x-gzip | gz |
application/x-hdf | hdf |
application/x-internet-signup | ins |
application/x-internet-signup | isp |
application/x-iphone | iii |
application/x-javascript | js |
application/x-latex | latex |
application/x-msaccess | mdb |
application/x-mscardfile | crd |
application/x-msclip | clp |
application/x-msdownload | dll |
application/x-msmediaview | m13 |
application/x-msmediaview | m14 |
application/x-msmediaview | mvb |
application/x-msmetafile | wmf |
application/x-msmoney | mny |
application/x-mspublisher | pub |
application/x-msschedule | scd |
application/x-msterminal | trm |
application/x-mswrite | wri |
application/x-netcdf | cdf |
application/x-netcdf | nc |
application/x-perfmon | pma |
application/x-perfmon | pmc |
application/x-perfmon | pml |
application/x-perfmon | pmr |
application/x-perfmon | pmw |
application/x-pkcs12 | p12 |
application/x-pkcs12 | pfx |
application/x-pkcs7-certificates | p7b |
application/x-pkcs7-certificates | spc |
application/x-pkcs7-certreqresp | p7r |
application/x-pkcs7-mime | p7c |
application/x-pkcs7-mime | p7m |
application/x-pkcs7-signature | p7s |
application/x-sh | sh |
application/x-shar | shar |
application/x-shockwave-flash | swf |
application/x-stuffit | sit |
application/x-sv4cpio | sv4cpio |
application/x-sv4crc | sv4crc |
application/x-tar | tar |
application/x-tcl | tcl |
application/x-tex | tex |
application/x-texinfo | texi |
application/x-texinfo | texinfo |
application/x-troff | roff |
application/x-troff | t |
application/x-troff | tr |
application/x-troff-man | man |
application/x-troff-me | me |
application/x-troff-ms | ms |
application/x-ustar | ustar |
application/x-wais-source | src |
application/x-x509-ca-cert | cer |
application/x-x509-ca-cert | crt |
application/x-x509-ca-cert | der |
application/ynd.ms-pkipko | pko |
application/zip | zip |
audio/basic | au |
audio/basic | snd |
audio/mid | mid |
audio/mid | rmi |
audio/mpeg | mp3 |
audio/x-aiff | aif |
audio/x-aiff | aifc |
audio/x-aiff | aiff |
audio/x-mpegurl | m3u |
audio/x-pn-realaudio | ra |
audio/x-pn-realaudio | ram |
audio/x-wav | wav |
image/bmp | bmp |
image/cis-cod | cod |
image/gif | gif |
image/ief | ief |
image/jpeg | jpe |
image/jpeg | jpeg |
image/jpeg | jpg |
image/pipeg | jfif |
image/svg+xml | svg |
image/tiff | tif |
image/tiff | tiff |
image/x-cmu-raster | ras |
image/x-cmx | cmx |
image/x-icon | ico |
image/x-portable-anymap | pnm |
image/x-portable-bitmap | pbm |
image/x-portable-graymap | pgm |
image/x-portable-pixmap | ppm |
image/x-rgb | rgb |
image/x-xbitmap | xbm |
image/x-xpixmap | xpm |
image/x-xwindowdump | xwd |
message/rfc822 | mht |
message/rfc822 | mhtml |
message/rfc822 | nws |
text/css | css |
text/h323 | 323 |
text/html | htm |
text/html | html |
text/html | stm |
text/iuls | uls |
text/plain | bas |
text/plain | c |
text/plain | h |
text/plain | txt |
text/richtext | rtx |
text/scriptlet | sct |
text/tab-separated-values | tsv |
text/webviewhtml | htt |
text/x-component | htc |
text/x-setext | etx |
text/x-vcard | vcf |
video/mpeg | mp2 |
video/mpeg | mpa |
video/mpeg | mpe |
video/mpeg | mpeg |
video/mpeg | mpg |
video/mpeg | mpv2 |
video/quicktime | mov |
video/quicktime | qt |
video/x-la-asf | lsf |
video/x-la-asf | lsx |
video/x-ms-asf | asf |
video/x-ms-asf | asr |
video/x-ms-asf | asx |
video/x-msvideo | avi |
video/x-sgi-movie | movie |
x-world/x-vrml | flr |
x-world/x-vrml | vrml |
x-world/x-vrml | wrl |
x-world/x-vrml | wrz |
x-world/x-vrml | xaf |
x-world/x-vrml | xof |
파일 확장자로 본 Mime Types
Extension | Type/sub-type |
---|---|
application/octet-stream | |
323 | text/h323 |
acx | application/internet-property-stream |
ai | application/postscript |
aif | audio/x-aiff |
aifc | audio/x-aiff |
aiff | audio/x-aiff |
asf | video/x-ms-asf |
asr | video/x-ms-asf |
asx | video/x-ms-asf |
au | audio/basic |
avi | video/x-msvideo |
axs | application/olescript |
bas | text/plain |
bcpio | application/x-bcpio |
bin | application/octet-stream |
bmp | image/bmp |
c | text/plain |
cat | application/vnd.ms-pkiseccat |
cdf | application/x-cdf |
cer | application/x-x509-ca-cert |
class | application/octet-stream |
clp | application/x-msclip |
cmx | image/x-cmx |
cod | image/cis-cod |
cpio | application/x-cpio |
crd | application/x-mscardfile |
crl | application/pkix-crl |
crt | application/x-x509-ca-cert |
csh | application/x-csh |
css | text/css |
dcr | application/x-director |
der | application/x-x509-ca-cert |
dir | application/x-director |
dll | application/x-msdownload |
dms | application/octet-stream |
doc | application/msword |
dot | application/msword |
dvi | application/x-dvi |
dxr | application/x-director |
eps | application/postscript |
etx | text/x-setext |
evy | application/envoy |
exe | application/octet-stream |
fif | application/fractals |
flr | x-world/x-vrml |
gif | image/gif |
gtar | application/x-gtar |
gz | application/x-gzip |
h | text/plain |
hdf | application/x-hdf |
hlp | application/winhlp |
hqx | application/mac-binhex40 |
hta | application/hta |
htc | text/x-component |
htm | text/html |
html | text/html |
htt | text/webviewhtml |
ico | image/x-icon |
ief | image/ief |
iii | application/x-iphone |
ins | application/x-internet-signup |
isp | application/x-internet-signup |
jfif | image/pipeg |
jpe | image/jpeg |
jpeg | image/jpeg |
jpg | image/jpeg |
js | application/x-javascript |
latex | application/x-latex |
lha | application/octet-stream |
lsf | video/x-la-asf |
lsx | video/x-la-asf |
lzh | application/octet-stream |
m13 | application/x-msmediaview |
m14 | application/x-msmediaview |
m3u | audio/x-mpegurl |
man | application/x-troff-man |
mdb | application/x-msaccess |
me | application/x-troff-me |
mht | message/rfc822 |
mhtml | message/rfc822 |
mid | audio/mid |
mny | application/x-msmoney |
mov | video/quicktime |
movie | video/x-sgi-movie |
mp2 | video/mpeg |
mp3 | audio/mpeg |
mpa | video/mpeg |
mpe | video/mpeg |
mpeg | video/mpeg |
mpg | video/mpeg |
mpp | application/vnd.ms-project |
mpv2 | video/mpeg |
ms | application/x-troff-ms |
mvb | application/x-msmediaview |
nws | message/rfc822 |
oda | application/oda |
p10 | application/pkcs10 |
p12 | application/x-pkcs12 |
p7b | application/x-pkcs7-certificates |
p7c | application/x-pkcs7-mime |
p7m | application/x-pkcs7-mime |
p7r | application/x-pkcs7-certreqresp |
p7s | application/x-pkcs7-signature |
pbm | image/x-portable-bitmap |
application/pdf | |
pfx | application/x-pkcs12 |
pgm | image/x-portable-graymap |
pko | application/ynd.ms-pkipko |
pma | application/x-perfmon |
pmc | application/x-perfmon |
pml | application/x-perfmon |
pmr | application/x-perfmon |
pmw | application/x-perfmon |
pnm | image/x-portable-anymap |
pot, | application/vnd.ms-powerpoint |
ppm | image/x-portable-pixmap |
pps | application/vnd.ms-powerpoint |
ppt | application/vnd.ms-powerpoint |
prf | application/pics-rules |
ps | application/postscript |
pub | application/x-mspublisher |
qt | video/quicktime |
ra | audio/x-pn-realaudio |
ram | audio/x-pn-realaudio |
ras | image/x-cmu-raster |
rgb | image/x-rgb |
rmi | audio/mid |
roff | application/x-troff |
rtf | application/rtf |
rtx | text/richtext |
scd | application/x-msschedule |
sct | text/scriptlet |
setpay | application/set-payment-initiation |
setreg | application/set-registration-initiation |
sh | application/x-sh |
shar | application/x-shar |
sit | application/x-stuffit |
snd | audio/basic |
spc | application/x-pkcs7-certificates |
spl | application/futuresplash |
src | application/x-wais-source |
sst | application/vnd.ms-pkicertstore |
stl | application/vnd.ms-pkistl |
stm | text/html |
svg | image/svg+xml |
sv4cpio | application/x-sv4cpio |
sv4crc | application/x-sv4crc |
swf | application/x-shockwave-flash |
t | application/x-troff |
tar | application/x-tar |
tcl | application/x-tcl |
tex | application/x-tex |
texi | application/x-texinfo |
texinfo | application/x-texinfo |
tgz | application/x-compressed |
tif | image/tiff |
tiff | image/tiff |
tr | application/x-troff |
trm | application/x-msterminal |
tsv | text/tab-separated-values |
txt | text/plain |
uls | text/iuls |
ustar | application/x-ustar |
vcf | text/x-vcard |
vrml | x-world/x-vrml |
wav | audio/x-wav |
wcm | application/vnd.ms-works |
wdb | application/vnd.ms-works |
wks | application/vnd.ms-works |
wmf | application/x-msmetafile |
wps | application/vnd.ms-works |
wri | application/x-mswrite |
wrl | x-world/x-vrml |
wrz | x-world/x-vrml |
xaf | x-world/x-vrml |
xbm | image/x-xbitmap |
xla | application/vnd.ms-excel |
xlc | application/vnd.ms-excel |
xlm | application/vnd.ms-excel |
xls | application/vnd.ms-excel |
xlt | application/vnd.ms-excel |
xlw | application/vnd.ms-excel |
xof | x-world/x-vrml |
xpm | image/x-xpixmap |
xwd | image/x-xwindowdump |
z | application/x-compress |
zip | application/zip |
출처 : PHPSCHOOL - 까칠한고민남
input에서 영문,숫자,특수문자만 입력받으려 할경우
XML-RPC 관련문서 링크
http://phpxmlrpc.sourceforge.net/ <-- PHP
http://blog.naver.com/locli?Redirect=Log&logNo=120003219109 <-- 전부
http://sourceforge.net/project/showfiles.php?group_id=87313 <-- Delphi
[DOC]
XML-RPC에 대한 개요 : http://www.redwiki.net/wiki/wiki.php/XML-RPC/ForNewbie
XML-RPC 스팩 문서 번역 : http://www.redwiki.net/wiki/wiki.php/XML-RPC/spec
XML-RPC 이미지로 설명 : http://static.userland.com/images/XML-RPC/xmlrpc.jpg
정규표현식의 기본 문법
정규표현식은 소프트웨어에 따라서 방식이나 지원 범위가 다를 수 있습니다.
“^The” |
"The"로 시작하는 문자열 |
"of despair$" |
"of despair"로 끝나는 문자열 |
"^abc$" |
"abc"로 시작하고 "abc"로 끝나는 문자열 ("abc" 라는 문자열도 해당됨) |
"notice" |
"notice"가 들어 있는 문자열 |
"ab*" |
a 다음에 b가 0개 이상 ("a", "ab", "abbb", 등) |
"ab+" |
a 다음에 b가 1개 이상 ("ab", "abbb", 등) |
"ab?" |
a 다음에 b가 있거나 없거나 (ab 또는 a) |
"ab{2}" |
a 다음에 b가 2개 있는 문자열 ("abb") |
"ab{2,}" |
a 다음에 b가 2개 이상 ("abb", "abbbb", 등.) |
"ab{3,5}" |
a 다음에 b가 3개에서 5개 사이 ("abbb", "abbbb", 또는 "abbbbb") |
'*', '+', '?'는 각각 "{0,}", "{1,}", "{0,1}"와 같습니다.
( )는 문자열을 묶음 처리할 때 사용 | |
"a(bc)*" |
a 다음에 “bc”가 0개 이상 (묶음 처리) |
"a(bc){1,5}" |
a 다음에 “bc”가 1개에서 5개 사이 |
"hi|hello" |
"hi"나 "hello"가 들어 있는 문자열 |
(응용) "(b|cd)ef" |
"bef" 또는 "cdef" |
(응용) "(a|b)*c" |
a와 b가 섞여서 여러번 나타나고 그뒤에 c가 붙어있는 패턴 |
. (점) |
임의의 한 문자 |
ex) "^.{3}$" 3문자로만 되어 있는 문자열 |
[] 괄호 안에 있는 내용 중 임의의 한 문자 [] 안에서 첫문자로 ‘^’를 쓰면 괄호 내용의 부정 – 즉 괄호 안에 포함되지 않는 한 문자 | |
"[ab]" |
a 또는 b ("a|b"와 동일한 표현) |
"[a-d]" |
소문자 'a'에서 'd'까지 ("a|b|c|d"또는 "[abcd]"와 동일) |
(응용) "^[a-zA-Z]" |
영문자로 시작하는 문자열 |
(응용) "[0-9]%" |
% 문자 앞에 하나의 숫자가 붙어 있는 패턴 |
(응용) "%[^a-zA-Z]%" |
두 % 문자 사이에 영문자가 없는 패턴 |
특수 문자 자체를 검색하기 및 사용하기 | ||||
\^ |
^ |
|
\. |
. |
\[ |
[ |
|
\$ |
$ |
\( |
( |
|
\) |
) |
\| |
| |
|
\* |
* |
\+ |
+ |
|
\? |
? |
\{ |
{ |
|
\\ |
\ |
\n |
줄넘김문자 |
|
\r |
리턴문자 |
\w |
알파벳과 _ (밑줄) |
|
\W |
알파벳과 _이 아닌 것 |
\s |
빈 공간 |
|
\S |
빈 공간이 아닌 것 |
\d |
숫자 |
|
\D |
숫자가 아닌 것 |
\b |
단어와 단어 사이의 경계 |
|
\B |
단어 사이의 경계가 아닌 곳 |
\t |
Tab문자 |
|
\xnn |
16진수 nn에 해당하는 문자 |
[ ] 안에서는 특수 문자가 모두 효력을 잃게 됩니다.
검색 + 치환을 위한 하부식(부분식) |
( )로 둘러싼 부분은 각각 하나의 덩어리로 취급해서, 검색시 ( ) 안에 해당되는 내용들을 변경할 내용에서 그대로 가져다 이용할 수 있습니다. 검색된 각각의 ( )안에 해당되는 내용은 변경할 내용에서 $1, $2, .. 등으로 지정해서 쓸 수 있습니다. |
예제) mp3파일 이름 바꾸기 검색 : (.*) - (.*)\.mp3 .*은 길이에 상관없이 임의의 문자열, \.은 점 치환 : $2 - $1.mp3 앞에서 검색한 ( )안에 해당되는 내용끼리 순서 바꾸기 ex) "제목 - 연주자.mp3" Þ "연주자 - 제목.mp3" |
앞에서 정의한 하부식을 다시 활용하기 (제가 잘못 이해한 것일 수도 있는데) |
\n은 ( ) 하부식 중에서 n번째 하부식을 가리킵니다. |
예제) (.+)\1+ \1로 되어 있으니까 첫번째 부분식 (.+)를 가리킵니다. 위 내용을 해석하자면, 일단 (.+)가 있으니까 이에 해당되는 내용을 찾고, \1+이 있으니까 첫번째 부분식 (.+)와 똑같은 내용이 그 뒤에 1번 이상 있는 문자열을 찾습니다. |
예제) abab같은 문자열이 위에 해당되는데, 일단 (.+) 즉 임의의 문자열 ab를 찾고 그 뒤에 \1+로 첫번째 부분식을 다시 1번 이상 있는 것을 찾으니까 뒤의 ab가 이에 해당합니다. |
| |
(?i) |
대소문자 무시 (기본값) |
(?-i) |
대소문자 구분 |
(?g) |
"greedy" 모드로 전환 (기본값) |
(?-g) |
"greedy" 모드 해제, 따라서 "+"는 "+?"과 동일한 것으로 인식 |
정규표현식의 기본 문법
정규표현식은 소프트웨어에 따라서 방식이나 지원 범위가 다를 수 있습니다.
“^The” |
"The"로 시작하는 문자열 |
"of despair$" |
"of despair"로 끝나는 문자열 |
"^abc$" |
"abc"로 시작하고 "abc"로 끝나는 문자열 ("abc" 라는 문자열도 해당됨) |
"notice" |
"notice"가 들어 있는 문자열 |
"ab*" |
a 다음에 b가 0개 이상 ("a", "ab", "abbb", 등) |
"ab+" |
a 다음에 b가 1개 이상 ("ab", "abbb", 등) |
"ab?" |
a 다음에 b가 있거나 없거나 (ab 또는 a) |
"ab{2}" |
a 다음에 b가 2개 있는 문자열 ("abb") |
"ab{2,}" |
a 다음에 b가 2개 이상 ("abb", "abbbb", 등.) |
"ab{3,5}" |
a 다음에 b가 3개에서 5개 사이 ("abbb", "abbbb", 또는 "abbbbb") |
'*', '+', '?'는 각각 "{0,}", "{1,}", "{0,1}"와 같습니다.
( )는 문자열을 묶음 처리할 때 사용 | |
"a(bc)*" |
a 다음에 “bc”가 0개 이상 (묶음 처리) |
"a(bc){1,5}" |
a 다음에 “bc”가 1개에서 5개 사이 |
"hi|hello" |
"hi"나 "hello"가 들어 있는 문자열 |
(응용) "(b|cd)ef" |
"bef" 또는 "cdef" |
(응용) "(a|b)*c" |
a와 b가 섞여서 여러번 나타나고 그뒤에 c가 붙어있는 패턴 |
. (점) |
임의의 한 문자 |
ex) "^.{3}$" 3문자로만 되어 있는 문자열 |
[] 괄호 안에 있는 내용 중 임의의 한 문자 [] 안에서 첫문자로 ‘^’를 쓰면 괄호 내용의 부정 – 즉 괄호 안에 포함되지 않는 한 문자 | |
"[ab]" |
a 또는 b ("a|b"와 동일한 표현) |
"[a-d]" |
소문자 'a'에서 'd'까지 ("a|b|c|d"또는 "[abcd]"와 동일) |
(응용) "^[a-zA-Z]" |
영문자로 시작하는 문자열 |
(응용) "[0-9]%" |
% 문자 앞에 하나의 숫자가 붙어 있는 패턴 |
(응용) "%[^a-zA-Z]%" |
두 % 문자 사이에 영문자가 없는 패턴 |
특수 문자 자체를 검색하기 및 사용하기 | ||||
\^ |
^ |
|
\. |
. |
\[ |
[ |
|
\$ |
$ |
\( |
( |
|
\) |
) |
\| |
| |
|
\* |
* |
\+ |
+ |
|
\? |
? |
\{ |
{ |
|
\\ |
\ |
\n |
줄넘김문자 |
|
\r |
리턴문자 |
\w |
알파벳과 _ (밑줄) |
|
\W |
알파벳과 _이 아닌 것 |
\s |
빈 공간 |
|
\S |
빈 공간이 아닌 것 |
\d |
숫자 |
|
\D |
숫자가 아닌 것 |
\b |
단어와 단어 사이의 경계 |
|
\B |
단어 사이의 경계가 아닌 곳 |
\t |
Tab문자 |
|
\xnn |
16진수 nn에 해당하는 문자 |
[ ] 안에서는 특수 문자가 모두 효력을 잃게 됩니다.
검색 + 치환을 위한 하부식(부분식) |
( )로 둘러싼 부분은 각각 하나의 덩어리로 취급해서, 검색시 ( ) 안에 해당되는 내용들을 변경할 내용에서 그대로 가져다 이용할 수 있습니다. 검색된 각각의 ( )안에 해당되는 내용은 변경할 내용에서 $1, $2, .. 등으로 지정해서 쓸 수 있습니다. |
예제) mp3파일 이름 바꾸기 검색 : (.*) - (.*)\.mp3 .*은 길이에 상관없이 임의의 문자열, \.은 점 치환 : $2 - $1.mp3 앞에서 검색한 ( )안에 해당되는 내용끼리 순서 바꾸기 ex) "제목 - 연주자.mp3" Þ "연주자 - 제목.mp3" |
앞에서 정의한 하부식을 다시 활용하기 (제가 잘못 이해한 것일 수도 있는데) |
\n은 ( ) 하부식 중에서 n번째 하부식을 가리킵니다. |
예제) (.+)\1+ \1로 되어 있으니까 첫번째 부분식 (.+)를 가리킵니다. 위 내용을 해석하자면, 일단 (.+)가 있으니까 이에 해당되는 내용을 찾고, \1+이 있으니까 첫번째 부분식 (.+)와 똑같은 내용이 그 뒤에 1번 이상 있는 문자열을 찾습니다. |
예제) abab같은 문자열이 위에 해당되는데, 일단 (.+) 즉 임의의 문자열 ab를 찾고 그 뒤에 \1+로 첫번째 부분식을 다시 1번 이상 있는 것을 찾으니까 뒤의 ab가 이에 해당합니다. |
| |
(?i) |
대소문자 무시 (기본값) |
(?-i) |
대소문자 구분 |
(?g) |
"greedy" 모드로 전환 (기본값) |
(?-g) |
"greedy" 모드 해제, 따라서 "+"는 "+?"과 동일한 것으로 인식 |
정규표현식의 기본 문법
먼저 특수문자 '^'와 '$'를 살펴봅시다. 이 문자의 역할은 문자열의 시작과 끝을 의미합니다. 다음과 같은 해당 예를 들 수 있습니다.
"^The": "The"로 시작하는 문자열
"of despair$": "of despair"로 끝나는 문자열
"^abc$": "abc"로 시작하고 "abc"로 끝나는 문자열 ("abc" 라는 문자열도 해당됨)
"notice": "notice"가 들어 있는 문자열
마지막 예제에서 보듯이 이 두 개의 특수문자가 없는 패턴은 검사대상이 되는 문자열에 어떤 위치에서든지 들어 있음 의미합니다.
특수문자로는 '*', '+', '?'도 있습니다. 이 문자들은 어떤 문자의 반복에 관한 지정을 해주는 문자입니다. 각각 '0또는 그 이상', '1또는 그 이상', '0또는 1'을 의미합니다. 여기에 몇 가지 예제가 있습니다.
"ab*": a뒤에 0 이상의 b가 있는 문자열 ("a", "ab", "abbb", 등);
"ab+": 위와 동일 하지만 최소한 하나 이상의 b가 있어야 함 ("ab", "abbb", 등);
"ab?": b가 하나 있을 수도 있고 없을 수도 있음 (ab 또는 a)
"a?b+$": a가 있을 수도 있고 없을 수도 있으며 그뒤에 하나 이상의 b로 끝나는 문자열
{ }를 사용하면 반복되는 수를 영역으로 지정할 수 있습니다.
"ab{2}": a뒤에 2개의 b가 있는 문자열 ("abb");
"ab{2,}": a뒤에 최소한 2개 이상의 b가 있는 문자열 ("abb", "abbbb", 등.);
"ab{3,5}": a뒤에 3개에서 5개 사이의 b가 있는 문자열 ("abbb", "abbbb", 또는 "abbbbb").
{ }를 사용할 대는 반드시 첫 번째 숫자는 적어야 됨을 유의합니다. ((O) "{0,2}", (X) "{,2}"). 또한 '*', '+', '?'는 각각 "{0,}", "{1,}", "{0,1}"와 같습니다.
이제 ()를 사용해서 하나의 문자가 아닌 여러 문자를 지정하는 방법을 알아봅니다.
"a(bc)*": a 뒤에 "bc"가 0또는 그이상의 수만큼 있는 문자열
"a(bc){1,5}": a 뒤에 "bc."가 1에서 5번 들어 있는 문자열
또 다른 특수문자로는 OR 연산을 하는 '|'를 들 수 있습니다.
"hi|hello": "hi"나 "hello"가 들어 있는 문자열
"(b|cd)ef": "bef" 또는 "cdef"
"(a|b)*c": a와 b가 섞여서 여러번 나타나고 그뒤에 c가 붙어있는 패턴
'.' (period)는 어떤 한 문자를 의미합니다.
"a.[0-9]": a뒤에 한 문자와 숫자가 붙어 있는 패턴
"^.{3}$": 3문자로만 되어 있는 문자열
[]표현은 문자열의 해당 위치에 사용될 수 있는 문자를 표현하는데 사용합니다.
"[ab]": a또는 b ("a|b"와 동일한 표현);
"[a-d]": 소문자 'a'에서 'd'까지 ("a|b|c|d"또는 "[abcd]"와 동일);
"^[a-zA-Z]": 영문자로 시작하는 문자열
"[0-9]%": % 문자 앞에 하나의 문자가 붙어 있는 패턴
",[a-zA-Z0-9]$": 영문자, 숫자로 끝나는 문자열 패턴
[]에서 '^'를 표현의 가장 처음에 사용하면 나타나서는 안 되는 문자를 지정할 수 있습니다. (예> "%[^a-zA-Z]%" 두 % 사이에 영문자가 없는 패턴)
"^.[$()|*+?{"같은 특수 문자는 백슬레쉬('')를 사용해서 escape될 수 있습니다( 역자 주 : escape 이란 다른 말로 literal로 탈출한다라고 할 수 있습니다 즉 특수문자로 인식되지 않고 일반 문자로 인식되게 합니다). 사용하는 관점에서 보면 백슬레쉬도 PHP3의 문자열에서 escape되어야 하기 때문에 예를 들어 "($|?[0-9]+"같은 정규표현식은 ereg("($|?[0-9]+", $str) 와 같이 사용됩니다 (이 표현식은 무얼 검사하는 걸까요? ^^;(이건 역자가 한 말이 아닙니다))
하지만 []안에서는 특수문자가 모두 효력을 읽게 되기 때문에 이 법칙을 벗어남을 기억하세요 []안에서는 백슬레쉬를 포함한 모든 특수문자들이 그 힘을 읽습니다 (예> "[*+?{}.]"는 말그대로 '*', '', '+', '?', '{', '}', '.' 문자를 의미합니다. 그리고 regex man 페이지에 나오듯이 ']'문자 자체를 포함하려면 문자들 리스트의 첫 번째에 위치시킵니다('^'가 있으면 '^'뒤에). '-'를 포함하려면 첫 번째 또는 마지막 문자로 지정하고 '-'문자가 영역의 경계 (예> a에서 -까지)일 경우 영역지정 문자의 두 번째 경계로 지정([a--])합니다.
완벽한 설명을 하려면 대조 순서(collating sequences), 문자 클래스(character classes), 동일 클래스(equivalence classes)에 대해서도 다루어야 하지만 이 글에서는 별 상관관계가 없기 때문에 regex man 페이지를 참고하도록 합니다.
-Validating Money Strings (금액 문자열 검사하기)
ok 이제 우리는 여기서 배운 것을 뭔가 실질적인 것에 적용 시켜봅시다. 사용자가 입력한 금액을 검사하는 정규표현식에 대해 알아봅니다. 금액은 "10000.00" 와 "10,000.00", 와, 센트 없이, "10000" 와 "10,000" 이렇게 4가지 방법으로 사용됩니다. (역자주 : 달러와 센트 군요 蝁,.蝁)
다음 정규표현식을 기초로 시작해 봅시다.
^[1-9][0-9]*$
이 정규표현식은 0으로 시작하지 않는 어떠한 수인지를 검사합니다. 하지만 "0"도 통과되지 못합니다. 그래서 다음과 같이 수정합니다.
^(0|[1-9][0-9]*)$
말로 표현하면 "0 이거나 0으로 시작하지 않는 수"입니다. 이제 수 앞에 -부호도 사용할 수 있게 수정해 봅니다.
^(0|-?[1-9][0-9]*)$
이 뜻은 "0 이거나 -이 있을 수 있는 수이고 이 수는 0으로 시작하지 않는다"입니다. 이제 좀 느슨하게 하고 유저가 0으로 시작하는 수도 입력할 수 있도록 해봅니다. 금액에 필요없는 -부호도 없애버립니다. 그리고 선택사항인 소수점 부분 패턴도 넣어서 다음 정규표현식이 나옵니다.
^[0-9]+(.[0-9]+)?$
하이라이트된 부분은 소수점(.)이 항상 최소한 하나이상의 수와 붙어 있어야 함을 의미합니다. 그러므로 예를 들면 "10."은 통과되지 못하고 "10" 과 "10.2"는 통과합니다.
^[0-9]+(.[0-9]{2})?$
이제 소수점 뒤에 반드시 2개의 수가 붙어 있어야 합니다. 이게 너무 심하다 싶으면 다음과 같이 해서
^[0-9]+(.[0-9]{1,2})?$
소수점 뒤에 하나의 숫자만 올 수도 있게 합니다. 이제 1000단위를 구분하는 ','를 표현해 봅니다.
^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
"1~3개의 숫자와 그 뒤에 ','와 3개의 숫자로 이루어진 부분이 0개 또는 그 이상이 붙어 있는 패턴". 쉽죠? 이제 ','도 선택사항(옵션:option)으로 만들어 봅니다.
^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
이게 전부입니다. 여기서 '+'를 '*'로 바꾸면 빈 문자열도 통과되는 패턴이 됩니다. 함수호출할 때 백슬래쉬 문자 escape하는 것 (역자 : /를 //로) 잊지 마세요. 일단 문자열이 검사되어 지면 str_replace("," , "" , $money) 함수로 ','를 없애버리고 double로 형 변환을 해서 산술연산에도 사용할 수 있게 합니다.
- Validating E-mail Addresses (E-mail 주소 검사하기)
이제 e-mail 주소를 살펴봅시다. e-mail주소는 3부분으로 구성됩니다. : user 명(@왼쪽편에 있는 모든 것), '@', 그리고 서버명(나머지 부분들) user명은 대문자 또는 소문자와 숫자, '.' '-', '_'로 구성됩니다. '_'를 제외하면 서버명도 마찬가지입니다. user 명은 .으로 시작하거나 끝나지 않습니다. domain명도 마찬가지입니다. 또한 .이 연속으로 있을 수도 없고 . 사이에는 최소한 하나 이상의 문자가 있어야 합니다. 이제 user명 부분을 검사하는 정규표현식을 만들어 봅시다.
^[_a-zA-Z0-9-]+$
이 정규표현식은 아직 .을 지원하지 않습니다. 다음과 같이 수정합니다.
^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*$
말로 하면 "최소한 하나의 유효한 문자(valid character)와 그 뒤에 .과 유효문자들로 구성된 부분이 0또는 그 이상이 있는 패턴"입니다.
좀 간단하게 하기 위해 이 정규표현식을 ereg()대신에 eregi()함수에 사용합니다. eregi()함수는 대소문자를 구분하지 않기 때문에 "a-z"와 "A-Z"같이 두 개의 영역을 지정하지 않아도 되는 이점이 있습니다.(둘 중 어떤 것이라도 상관없음)
^[_a-z0-9-]+(.[_a-z0-9-]+)*$
서버명의 경우 '_'만 제외하고는 동일합니다.
^[a-z0-9-]+(.[a-z0-9-]+)*$
이제 '@'를 중심으로 서로 붙여서 다음과 같이 만들어 냅니다.
^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$
- 기타 사용
Extracting Parts of a String (문자열의 일부분 잘라내기)
ereg()와 eregi()함수는 문자열에서 패턴에 해당되는 부분을 잘라내는 기능이 있습니다. (메뉴얼 참고) 예를 들면 path/URL 문자열에서 파일명을 잘라내고 싶은 경우 다음과 같은 코드가 필요할 것입니다.
ereg("([^/]*)$", $pathOrUrl, $regs);
echo $regs[1];
Advanced Replacing (치환의 발전된 형태)
ereg_replace() 와 eregi_replace()는 아주 유용한 함수입니다. 문자열에 있는 모든 문자를 ','로 구분한다고 가정해 봅시다. 다음과 같이 할 수 있습니다. (역자 : trim()함수는 문자열의 앞과 뒤에 있는 공백문자를 모두 제거하는 함수)
ereg_replace("[ nrt]+", ",", trim($str));