Sunday, July 17, 2011

Tìm hiểu về biểu thức chính quy (regular expression)

Biểu thức so mẫu (pattern) dùng để mô tả 1 cách tổng quát 1 đối tượng (chuỗi) trong PHP, ví dụ:
preg_replace('/[^a-z0-9]+/i','',$str);
--> hàm này l loại bỏ tất cả các ký tự không phải là chữ (a-z và A-Z) hoặc số (0-9) ra khỏi chuỗi $str

Biểu thức so mẫu dùng rất hiệu quả và nhanh chóng, tuy nhiên theo TG biết thì cũng không nhiều người biết sử dụng cái này(nhất là ở nơi không có trường lớp đào tạo cơ bản về PHP như VN chúng ta) còn số người biết,hiểu rõ thì không training lại nên đã ít nay càng ít người biết sử dụng biểu thức so mẫu. Trong bài này TG chỉ giới thiệu 1 số kiến thức cơ bản và 1 vài ví dụ để dễ hiểu, hy vọng là giúp ít cho anh em.
Cấu trúc: như ví dụ trên thì /[^a-z0-9]+/i là 1 biểu thức so mẫu,
- giới hạn trong cặp dấu //x hoặc ##x
- x có thể là 1 hoặc nhiều ký tự để mô tả dữ liệu được lấy và cũng có thể không có trong biểu thức so mẫu. Một số giá trị có thể có của x:
+ i: không phân biệt chữ hoa, chữ thường
+ s: bao gồm cả các ký tự xuống dòng
+ Ngoài còn có 1 số giá trị khác như: S,U,... nhưng ít được sử dụng

Ta lấy ví dụ cho dễ hình dung:
preg_replace('/[^a-z0-9]/','','phpBASIC$')
-> php
preg_replace('/[^a-z0-9]/i','','phpBASIC$')
-> phpBASIC
Ý nghĩa của các ký tự trong biểu thức so mẫu:

\ loại bỏ các ký tự đặc biệt của pattern
/(phpbasic)/ : chuỗi phpbasic
/\(phpbasic\)/ : chuỗi (phpbasic)


^ ký tự bắt đầu
/^php(.*)/ : những chuỗi bắt đầu bằng chữ php


$ ký tự kết thúc
/(.*)basic$/ : những chuỗi kết thúc bằng chữ basic


. bất kỳ ký tự nào trừ ký tự xuông dòng
/(.*)/ : tất cả các ký tự nằm trên 1 dòng


[ và ] bắt đầu và kết thúc 1 lớp ký tự
/[a-z]/ : tất cả các ký tự a-z
chú ý trong 1 lớp:
^ phủ định:
/[^a-z]/ : những ký tự không phải là a-z
- 1 khoảng:
/[a-d]/ : bao gồm a,b,c,d


| hoặc
/a|b/ : ký tự a hoặc b
( và ) bắt đầu và kết thúc 1 so mẫu con
/^a(c|d)b/ : chuỗi có dạng acb hoặc acd


? có hoặc không
/ab?c/ : chuỗi có dạng abc hoặc ac


* : 0 hoặc nhiều hơn ký tự
/a*/ : , a, aa, aaa,.............


+ : có ít nhất 1
/a+/ : a,aa,aaa,...............


{ và } bắt đầu và kết thúc min/max ký tự
/a{1,3}/ : a,aa,aaa


Các ký tự đặc biệt khác:

\n hoặc \r : ký tự xuông dòng
\t : ký tự tab
\d : bất kỳ ký tự số nào
\D : bất kỳ ký tự nào mà không phải là số
\s : bất kỳ ký tự khoảng trắng
\S : bất kỳ ký không phải là khoảng trắng
\w : bất kỳ từ nào ([a-zA-Z0-9])
\W : không phải là từ ([^a-zA-Z0-9])

Thursday, July 14, 2011

Resizing images with PHP

class SimpleImage {

var $image;

var $image_type;

function load($filename) {



load('picture.jpg');
$image->resizeToWidth(250);
$image->save('picture2.jpg');
?>
$image_info = getimagesize($filename);
$this->image_type = $image_info[2];

if( $this->image_type == IMAGETYPE_JPEG ) {

$this->image = imagecreatefromjpeg($filename);

} elseif( $this->image_type == IMAGETYPE_GIF ) {


$this->image = imagecreatefromgif($filename);
} elseif( $this->image_type == IMAGETYPE_PNG ) {


$this->image = imagecreatefrompng($filename);
}

}
function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {


if( $image_type == IMAGETYPE_JPEG ) {
imagejpeg($this->image,$filename,$compression);

} elseif( $image_type == IMAGETYPE_GIF ) {

imagegif($this->image,$filename);

} elseif( $image_type == IMAGETYPE_PNG ) {

imagepng($this->image,$filename);

}
if( $permissions != null) {


chmod($filename,$permissions);
}
}
function output($image_type=IMAGETYPE_JPEG) {


if( $image_type == IMAGETYPE_JPEG ) {
imagejpeg($this->image);

} elseif( $image_type == IMAGETYPE_GIF ) {

imagegif($this->image);

} elseif( $image_type == IMAGETYPE_PNG ) {

imagepng($this->image);

}
}
function getWidth() {

return imagesx($this->image);

}
function getHeight() {

return imagesy($this->image);

}
function resizeToHeight($height) {

$ratio = $height / $this->getHeight();

$width = $this->getWidth() * $ratio;
$this->resize($width,$height);

}

function resizeToWidth($width) {
$ratio = $width / $this->getWidth();

$height = $this->getheight() * $ratio;
$this->resize($width,$height);

}

function scale($scale) {
$width = $this->getWidth() * $scale/100;

$height = $this->getheight() * $scale/100;

$this->resize($width,$height);
}

function resize($width,$height) {

$new_image = imagecreatetruecolor($width, $height);
imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());

$this->image = $new_image;
}

}
?>







Save the above file as SimpleImage.php and take a look at the following examples of how to use the script.


The first example below will load a file named picture.jpg resize it to 250 pixels wide and 400 pixels high and resave it as picture2.jpg



1
2
3
4
5
6
7
<?php
include('SimpleImage.php');

$image = new SimpleImage();
$image->load('picture.jpg');

$image->resize(250,400);
$image->save('picture2.jpg');

?>


If you want to resize to a specifed width but keep the dimensions ratio the same then the script can work out the required height for you, just use the resizeToWidth function.



1
2
3
4
5
6
7
<?php
include('SimpleImage.php');
$image = new SimpleImage();

$image->load('picture.jpg');
$image->resizeToWidth(250);

$image->save('picture2.jpg');
?>


You may wish to scale an image to a specified percentage like the following which will resize the image to 50% of its original width and height



1
2
3
4
5
6
7
<?php

include('SimpleImage.php');
$image = new SimpleImage();

$image->load('picture.jpg');
$image->scale(50);

$image->save('picture2.jpg');
?>


You can of course do more than one thing at once. The following example will create two new images with heights of 200 pixels and 500 pixels



1
2
3
4
5
6
7
8
9
<?php

include('SimpleImage.php');
$image = new SimpleImage();

$image->load('picture.jpg');
$image->resizeToHeight(500);

$image->save('picture2.jpg');
$image->resizeToHeight(200);

$image->save('picture3.jpg');
?>


The output function lets you output the image straight to the browser without having to save the file. Its useful for on the fly thumbnail generation



1
2
3
4
5
6
7
8
<?php

header('Content-Type: image/jpeg');
include('SimpleImage.php');
$image = new SimpleImage();

$image->load('picture.jpg');
$image->resizeToWidth(150);

$image->output();
?>


The following example will resize and save an image which has been uploaded via a form



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

if( isset($_POST['submit']) ) {


include('SimpleImage.php');
$image = new SimpleImage();

$image->load($_FILES['uploaded_image']['tmp_name']);
$image->resizeToWidth(150);

$image->output();
} else {

?>


<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="uploaded_image" />

<input type="submit" name="submit" value="Upload" />

</form>

<?php

}
?>


Further Inf

Saturday, July 9, 2011

Tự động canh chỉnh code PHP, Autoindent PHP Array in Notepad++?

I'm currently having difficulty with auto-indenting PHP arrays that span multiple lines. The standard TextFX > TextFX Edit > Reindent C++ Code fails here.

For example, take the following code snippet:

php
$something
= array(
"test" => $var,
"nested" => array(
"subnest" = array(
"low" => "yes",
"foo" => "bar",
),
"bar" => "baz",
),
"last" => "yes",
);

Run "Reindent C++ Code" and get this:

php
$something
= array(
"test" => $var,
"nested" => array(
"subnest" = array(
"low" => "yes",
"foo" => "bar",
),
"bar" => "baz",
),
"last" => "yes",
);

Not really what I was after.

Is there any tool I'm missing or plugin that can properly indent PHP arrays in Notepad++?

Thursday, July 7, 2011

SHA encrypt the password

import java.security.MessageDigest;
import sun.misc.BASE64Encoder;

/**
* String encryption related utilities.
* @author C. Peter Chen of http://dev-notes.com
* @date 20080512
*/

public class StringEncryptUtil {
/**
* This main() class is used for demo only.
* @param args
*/
public static void main(String[] args) {
System.out.println("SHA encrypted mySecr3tP4ssw0rd: " + encryptSha("mySecr3tP4ssw0rd"));
}

/**
* Performs a SHA encryption process on the incoming string parameter.
* @param inputStr
* @return SHA-encrypted string if successful, or null if there are problems.
*/
public static synchronized String encryptSha(String inputStr) {
try {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(inputStr.getBytes("UTF-8"));
byte digest[] = md.digest();
return (new BASE64Encoder()).encode(digest);
}
catch (Exception e) {
return null;
}
}
}