text:
Regular Expression
13:07PM 13/06/2011, Lập trình web
Regular Expressions là gì? Regular Expressions (Regex) dịch ra tiếng Việt là Biểu thức chính quy. Khái niệm này nằm trong 1 mớ lý thuyết vô cùng đồ sộ và hầm hố . Nhưng ko nên lo lắng, ta có thể hiểu nôm na Regex là 1 cái mẫu (pattern) dùng để mô tả 1 lớp ký tự nào đó.
VD: lazydog là 1 regex. Nó là 1 mẫu đơn giản nhất vì nó so khớp (match) với đoạn text lazydog. 1 match là 1 đoạn text so khớp với mẫu.
VD phức tạp hơn 1 chút: b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}b Đây là mẫu mô tả 1 địa chỉ email. Mẫu này có thể dc dùng để tìm 1 địa chỉ email trong 1 đoạn văn bản, hoặc kiểm tra xem 1 chuỗi có phải là địa chỉ email hợp lệ hay ko.
Regex có thể dc sử dụng với bất kỳ dữ liệu nào mà ta có thể truy cập, thông qua ứng dụng hoặc ngôn ngữ lập trình. Có thể kể đến 1 số ứng dụng xử lý văn bản hỗ trợ regex: PowerGREP, EditPad Pro, RegexBuddy,...
Regular Expression Engines
Regex engine là 1 bộ phận của phần mềm, chuyên để xử lý regex (so khớp mẫu với 1 chuỗi nào đó). Có nhiều regex engine và chúng ko hoàn toàn tương thích với nhau. Cú pháp regex (flavor) của mỗi engine cũng có sự khác nhau. Loạt bài này sẽ tập trung vào cú pháp regex dc sử dụng trong Perl 5, vì nó phổ biến nhất. Rất nhiều engine regex khác giống với engine sử dụng trong Perl 5: engine nguồn mở PCRE (sử dụng trong rất nhiều ngôn ngữ lập trình, như PHP, cái ta cần đây hehe ), thư viện regex .NET,...
OK vậy là ta đã hiểu sơ qua regex là cái gì, giờ để tấn công vào cái địa ngục này, ta cần có vũ khí. Có thể sử dụng 1 số ứng dụng xử lý text ở trên để thực hành các biểu thức regex, hoặc ko thì ta tự tạo lấy 1 cái thô sơ bằng PHP.
Trong PHP, ta có thể sử dụng biểu thức regex thông qua các hàm regex. PHP cung cấp 3 nhóm hàm regex, tên của chúng dc bắt đầu bởi: ereg, mb_ereg và preg. 2 loại đầu sử dụng engine POSIX Extended, còn preg sử dụng engine PCRE (Perl-Compatible). Vậy thì vũ khí của ta đơn giản chỉ là đoạn mã PHP sau:
$string = 'chuỗi cần áp dụng biểu thức regex';
$pattern = '/biểu thức regex/';
preg_match($pattern, $string, $match);
echo $match[0];
?>
Nó sẽ hiện lên màn hình kết quả so khớp biểu thức regex với chuỗi mà ta áp dụng regex vào. Như thấy ở trên, ta dùng nhóm hàm preg vì nó sử dụng engine PCRE rất giống với engine của Perl, loại engine có cú pháp mà ta đang thảo luận ở đây. Trong loạt bài này, ta sẽ qui ước màu sắc như trong đoạn mã trên: red cho biểu thức regex, green cho chuỗi áp dụng regex, và blue cho kết quả so khớp.
Ký tự thông thường và ký tự đặc biệt
Ký tự thông thường (Literal Characters)
Regex cơ bản nhất chính là biểu thức bao gồm 1 ký tự thông thường, VD: a. Nó sẽ so khớp với thực thể đầu tiên của ký tự đó trong chuỗi. VD nếu có chuỗi: LazyDog is a boy, nó sẽ so khớp với ký tự a sau ký tự L. Regex này cũng có thể so khớp với ký tự a thứ 2 nếu ta điều khiển regex engine tiếp tục tìm kiếm sau khi đã so khớp dc 1 lần.
Cũng như vậy, regex dog sẽ so khớp với dog trong chuỗi LazyDog is not a dog. Regex này bao gồm 1 sêri 3 ký tự thông thường. Engine sẽ hiểu biểu thức này là: tìm d, theo sau bởi o, theo sau bởi g.
Chú ý rằng regex engine mặc định phân biệt chữ hoa và chữ thường. Dog ko so khớp với dog.
Ký tự đặc biệt (Special Characters)
Vì ta cần làm nhiều công việc phức tạp hơn là tìm kiếm 1 đoạn văn bản, cho nên phải trưng dụng 1 vài ký tự để làm những nhiệm vụ đặc biệt. Trong cú pháp regex dc thảo luận ở đây, có 11 ký tự mang ý nghĩa đặc biệt: [ ^ $ . | ? * + ( ). Chúng dc gọi là các metacharacter.
Nếu cần dùng các ký tự này với ý nghĩa thông thường, ta phải giải phóng nó bằng . VD nếu cần so khớp 1+1=2, thì regex đúng sẽ là 1+1=2. Chú ý rằng 1+1=2 cũng là regex đúng, nên sẽ ko báo lỗi, nhưng nó sẽ ko cho ta kết quả như mong muốn. Regex 1+1=2 sẽ so khớp với 111=2 trong chuỗi 123+111=234, vì dấu + ở đây mang ý nghĩa đặc biệt.
Nếu ta quên ko giải phóng ký tự đặc biệt ở những chỗ nó ko dc phép đứng thì sẽ gặp lỗi. VD: +1
Hầu hết các loại cú pháp regex đều coi { như 1 ký tự thông thường, trừ khi nó là 1 phần của toán tử nhắc lại (repetition operator), VD: {1, 3}. Vì vậy ta ko cần giải phóng ký tự này.
Ta chỉ dùng để giải phóng các ký tự đặc biệt, còn các ký tự khác thì ko nên, vì cũng là 1 ký tự đặc biệt. khi kết hợp với 1 ký tự thông thường sẽ có ý nghĩa đặc biệt, VD: d sẽ so khớp với 1 chữ số từ 0 - 9.
Tất cả các loại cú pháp regex đều cho phép giải phóng 1 ký tự đặc biệt bằng . Rất nhiều cú pháp khác còn hỗ trợ kiểu giải phóng Q... E. Tất cả các ký tự nằm trong cặp Q và E sẽ dc coi như ký tự thông thường. VD: Q*d+*E sẽ so khớp với đoạn văn bản *d+* . Kiểu cú pháp này dc hỗ trợ bởi JGsoft engine, Perl, PCRE, ...
Ký tự đặc biệt và ngôn ngữ lập trình
Khác với trong ngôn ngữ lập trình, trong regex, ký tự ' và " ko phải là ký tự đặc biệt. Vì vậy, ko cần phải giải phóng nó.
Trong mã nguồn của 1 chương trình, cần luôn ghi nhớ những ký tự nào dc ngôn ngữ lập trình xử lý đặc biệt. Bởi vì những ký tự này sẽ dc trình biên dịch xử lý trước khi dc engine regex xử lý. VD: regex 1+1=2 phải dc viết thành 1+1=2 trong mã nguồn C++. Trình biên dịch C++ sẽ chuyển thành trong chuỗi trên, sau đó nó mới dc chuyển đến regex engine. VD khác: đế so khớp c:temp, cần dùng regex c: emp (vì t trong regex mang ý nghĩa đặc biệt). Và trong mã nguồn C++, regex này cần dc viết là c:\temp. Đúng là địa ngục . Ko bit trong PHP của chúng ta thì thế nào đây hic :'(.
Ký tự ko in được
Có thể dùng các tổ hợp ký tự đặc biệt để đặt các ký tự ko in dc vào regex.
t cho ký tự tab (ASCII 0x09)
r cho carriage return (0x0D)
n cho line feed (0x0A).
a (bell, 0x07)
e (escape, 0x1B)
f (form feed, 0x0C)
v (vertical tab, 0x0B).
Chú ý rằng Windows text files sử dụng rn để kết thúc dòng, còn UNIX text files sử dụng n.
Có thể dùng cách này để viết bất kỳ ký tự nào nếu biết mã 16 ASCII của ký tự đó trong bảng mã đang dùng. VD trong bảng mã Latin-1, ký tự copyright có mã 0xA9. Vì thế để tìm ký tự này, ta dùng xA9.
Hầu hết các loại cú pháp regex còn cho phép sử dụng tổ hợp cA đến cZ (c cố định, theo sau bởi 1 chữ cái hoa từ A - Z) để biểu thị ký tự điều khiển. VD cA biểu thị Control+A. cM biểu thị Control+M, hay carriage return, giống như r.
Nếu regex engine hỗ trợ Unicode, ta sử dụng uFFFF thay cho xFF để biểu thị 1 ký tự Unicode. VD: mã unicode của ký tự đồng euro là 0x20AC. Để đặt nó vào biểu thức regex, ta dùng u20AC.
Regex Engine làm việc như thế nào?
Hiểu dc cách làm việc của regex engine sẽ giúp ta viết regex tốt hơn, dễ dàng hơn. Nó giúp ta hiểu dc tại sao 1 regex hoạt động ko như mong muốn, và giúp tiết kiệm thời gian phải mò mẫm khi viết các regex phức tạp.
Có 2 loại regex engine: text-directed engines, và regex-directed engines. Loại cú pháp regex mà ta đang thảo luận ở đây thuộc loại regex-directed engines. Loại engine này phổ biến hơn bởi nó có 1 số chức năng rất hữu dụng như: lazy quantifiers, backreferences,...
Có thể dễ dàng kiểm tra xem loại cú pháp đang sử dụng thuộc về engine nào qua việc kiểm tra xem lazy quantifiers và backreferences có dc hỗ trợ ko. Hãy thử dùng biểu thức regex regex|regex not vào chuỗi regex not xem sao. Nếu kết quả so khớp là regex, thì engine đang dùng thuộc loại regex-directed. Nêu kết quả là regex not, thì engine thuộc loại text-directed. Tại sao lại thế thì hồi sau sẽ rõ
Trong các VD ở các bài tiếp theo, ta sẽ phân tích cụ thể cách thức làm việc của regex engine, qua đó giúp sử dụng regex hiệu quả nhất và tránh mắc lỗi.
Regex-directed engine luôn trả về kết quả so khớp bên trái nhất
Thậm chí nếu 1 match tốt hơn có thể dc tìm thấy nếu tiếp tục so khớp. Đây là điều cần ghi nhớ. Regex-directed engine luôn bắt đầu so khớp với ký tự đầu tiên của chuỗi.
Hãy lấy 1 VD đơn giản nhất để minh hoạ: ta dùng regex cat vào chuỗi He captured a catfish for his cat. Engine sẽ bắt đầu so khớp dấu hiện đầu tiên trong regex là c với ký tự đầu tiên của chuỗi là H. Ko khớp. Vì vậy nó tiếp tục lần lượt so khớp với ký tự thứ 2 và 3 là e và space. Đều ko khớp. Đến ký tự thứ 4, c đã khớp với c. Xong, giờ engine bắt đầu so khớp dấu hiệu thứ 2 trong regex là a với ký tự thứ 5 của chuỗi là a. Khớp. Nhưng đến dấu hiệu thứ 3 của regex là t thì ko khớp với ký tự thứ 6 của chuỗi là p. Lúc này engine ngộ ra rằng ko thể tìm ra 1 match bắt đầu từ ký tự thứ 4 của chuỗi. Vì vậy, nó bắt đầu lại công việc từ đầu, từ ký tự thứ 5 của chuỗi. Regex c ko khớp với a. Cứ tiếp tục như vậy cho đến ký tự thứ 15 của chuỗi, regex c đã khớp với c. Engine lần lượt so khớp các dấu hiệu còn lại trong regex với các ký tự tiếp theo trong chuỗi: a khớp a, t khớp t. Và như vậy 1 match đã dc tìm thấy bắt đầu từ ký tự 15. Engine sẽ trả về kết quả và ngừng luôn, ko tiếp tục tìm xem còn match nào tốt hơn ko (VD: cat ở cuối chuỗi).
Lớp ký tự (Character Classes - Character Sets)
Lớp ký tự
Sử dụng lớp ký tự, ta sẽ khiến regex engine chỉ chọn ra 1 ký tự để so khớp. Để sử dụng, ta đặt các ký tự cần so khớp vào 2 dấu [ và ]. VD: để so khớp ký tự a hoặc e, ta dùng [ae]. Như vậy biểu thức gr[ae]y sẽ khớp với gray hoặc grey.
Lớp ký tự chỉ so khớp với 1 ký tự đơn. Như vậy gr[ae]y sẽ ko khớp với graay, graey,v.v... Thứ tự các ký tự trong lớp ko quan trọng. Kết quả trả về luôn giống nhau.
Để xác định 1 vùng ký tự trong lớp ký tự, ta sử dụng dấu - . VD: [0-9] so khớp với 1 chữ số từ 0 - 9. Có thể sử dụng nhiều vùng ký tự hoặc kết hợp vùng ký tự với ký tự đơn. VD: [0-9a-fA-F] so khớp với 1 chữ số hệ 16, ko phân biệt chữ hoa, thường. [0-9a-fxA-FX] so khớp với 1 chữ số hệ 16 hoặc chữ cái X, ko phân biệt chữ hoa, thường. Cũng như trên, thứ tự các vùng ko quan trọng.
Lớp ký tự phủ định
Đặt dấu ^ sau [ trong lớp ký tự sẽ phủ định lớp ký tự đó. Kết quả là lớp ký tự sẽ so khớp với bất kỳ ký tự nào ko nằm trong lớp ký tự đó. Lớp ký tự phủ định có thể so khớp với cả ký tự line break.
Chú ý rằng lớp ký tự phủ định vẫn phải dc so khớp với 1 ký tự. VD: q[^u] ko phải là "q ko theo sau bởi u" mà là "q theo sau bởi 1 ký tự ko phải u". Vì vậy nó sẽ ko so khớp với q trong chuỗi Iraq, và sẽ so khớp với q và space trong chuỗi Iraq is a country.
Metacharacter trong lớp ký tự
Trong lớp ký tự, các ký tự mang ý nghĩa đặc biệt hay metacharacter chỉ bao gồm: ] ^ -. Các metacharacter nói ở phần trước khi đặt trong lớp ký tự sẽ chỉ dc coi như ký tự thông thường, và do đó ko cần phải giải phóng. VD: để tìm ký tự * hoặc +, ta dùng [+*].
Để đặt ký tự vào trong lớp ký tự với nghĩa thông thường, cần giải phóng nó bằng 1 ký tự khác. VD: [x] sẽ khơp với ký tự hoặc x. Các ký tự ] ^ - nếu muốn dùng theo nghĩa thông thường cũng phải dc giải phóng bằng hoặc đặt nó ở vị trí mà nó sẽ ko có ý nghĩa đặc biệt. Ta nên dùng cách thứ 2 để biểu thức regex trông dễ nhìn hơn như sau:
Với ^, đặt nó ở bất kỳ chỗ nào trừ vị trí ngay sau [ . VD: [x^] sẽ khớp với x hoặc ^.
Với ], đặt nó ngay sau [ hoặc [^ . VD: []x] sẽ khớp với ] hoặc x. [^]x] sẽ khớp với bất kỳ ký tự nào ko phải là ] hoặc x.
Với -, đặt nó ngay sau [ hoặc [^ , hoặc ngay trước ]. VD: cả [-x] và [x-] đều so khớp với - hoặc x.
Có thể sử dụng tất cả các ký tự ko in dc trong lớp ký tự giống như dùng chúng ngoài lớp ký tự. VD: [$u20AC] sẽ khớp với $ hoặc ký tự đồng euro (với giả định cú pháp regex đang dùng hỗ trợ unicode).
JGsoft engine, Perl và PCRE còn hỗ trợ kiểu Q...E trong lớp ký tự để giải phóng 1 chuỗi ký tự. VD: [Q[-]E] sẽ khớp với [ hoặc - hoặc ].
Cú pháp regex của POSIX lại xử lý trong lớp ký tự như 1 ký tự thông thường. Đồng nghĩa với việc ta ko thể dùng để giải phóng ] ^ -. Để làm việc này ta chỉ còn cách đặt chúng vào các vị trí như trình bày ở trên. Ngoài ra điều này cũng đồng nghĩa với việc các cú pháp tắt (shorthand, VD: d) ko còn hiệu lực.
Lớp ký tự viết tắt (Shorthand Character Classes)
d là dạng tắt của [0-9].
w dc gọi là "ký tự từ" (word character). Chính xác những ký tự nào dc khớp với nó thay đổi tuỳ theo mỗi loại cú pháp regex. Trong tất cả các loại cú pháp, nó sẽ bao gồm [A-Za-z]. Trong hầu hết các loại cú pháp, nó cũng bao gồm cả dấu _ và chữ số.
s dc gọi là "ký tự trắng" (whitespace character). Nó khớp với ký tự nào thì cũng tùy thuộc vào từng loại cú pháp. Trong kiểu cú pháp thảo luận ở đây, nó bao gồm [t]. Nghĩa là s sẽ khớp với space hoặc tab. Trong hầu hết cú pháp , nó cũng bao gồm cả ký tự carriage return hoặc line feed, nghĩa là [trn]. Một số cú pháp khác lại bao gồm thêm cả các ký tự ko in dc hiếm khi dùng như vertical tab hoặc form feed.
Các lớp ký tự viết tắt có thể dc dùng cả trong lẫn ngoài cặp []. VD: sd khớp với 1 ký tự trắng theo sau bởi 1 chữ số. [sd] khớp với 1 ký tự đơn là 1 ký tự trắng hoặc 1 chữ số. Khi áp dụng vào chuỗi 1 + 2 = 3, regex thứ 1 sẽ khớp với 2 (space và 2), trong khi regex thứ 2 sẽ khớp với 1. [da-fA-F] khớp với 1 chữ số hệ 16, giống như [0-9a-fA-F].
Lớp ký tự viết tắt phủ định (Negated Shorthand Character Classes)
D tương đương [^d]
W tương đương [^w]
S tương đương [^s]
Cần thận trọng khi sử dụng dạng viết tắt phủ địng bên trong []. [DS] khác với [^ds]. Regex thứ 2 sẽ khớp với bất kỳ ký tự nào ko phải là chữ số hoặc ký tự trắng. Còn regex thứ 1 sẽ khớp với bất kỳ ký tự nào ko phải là chữ số hoặc ko phải là ký tự trắng. Và vì chữ số ko phải là ký tự trắng và ký tự trắng ko phải là chữ số cho nên [DS] sẽ khớp với bất kỳ ký tự nào, bao gồm cả ký tự trắng và chữ số .
Nhắc lại lớp ký tự (Repeating Character Classes)
Nếu nhắc lại lớp ký tự khi dùng các toán tử nhắc lại ? * + , ta sẽ nhắc lại cả lớp ký tự chứ ko chỉ nhắc lại ký tự mà nó so khớp. VD: regex [0-9]+ sẽ khớp với cả 837 lẫn 222.
Nếu muốn nhắc lại chỉ các ký tự dc so khớp, ta cần dùng tham chiếu ngược (backreferences). ([0-9])1+ sẽ khớp với 222 chứ ko khớp với 837. Khi áp dùng regex này vào chuỗi 833337, nó sẽ khớp với 3333. Chi tiết hơn thì hồi sau sẽ rõ
Ký tự chấm (Dot)
Ký tự Dot khớp với hầu hết các ký tự
Trong biểu thức regex, dấu . là metacharacter dc sử dụng nhiều nhất, và cũng là ký tự bị sử dụng sai nhiều nhất.
Dấu . khớp với 1 ký tự đơn bất kỳ ngoại trừ ký tự newline. Vì vậy, dấu . tương đương với [^n] (trong UNIX) hoặc [^rn] (trong Windows).
Trong Perl, dấu . có thể khớp với cả newline nếu ta dùng chế độ "single-line mode". Để sử dụng chế độ này, ta thêm s vào sau biểu thức regex, VD: m/^regex$/s;
JavaScript và VBScript ko có chế độ nào hỗ trợ Dot so khớp với các ký tự line break. Vì vậy, để so khớp với bất kỳ ký tự nào ta phải dùng [sS] thay cho Dot. [sS] so khớp với 1 ký tự là ký tự trắng (bao gồm cả các ký tự line break) hoặc ko phải ký tự trắng, nghĩa là nó so khớp với bất kỳ ký tự nào.
Sử dụng Dot 1 cách tiết kiệm
Dấu . là 1 metacharacter đầy uy lực. Nó có thể khớp với bất kỳ ký tự nào, nhưng cũng có thể khớp với ký tự mà ta ko muốn. Những trường hợp như thế có thế rất khó nhận ra.
Hãy lấy 1 VD đơn giản để minh hoạ: giải sử ta muốn tìm 1 chuỗi ngày tháng năm dưới dạng mm/dd/yy, trong đó dấu phân cách ngày tháng năm ta để người dùng tuỳ chọn. Giải pháp nhanh nhất là dd.dd.dd. Trông có vẻ ổn. Nó sẽ khớp 1 chuỗi kiểu như 02/12/03. Vấn đề là 1 chuỗi kiểu như 02512703 cũng dc coi là 1 ngày hợp lệ với regex trên (chấm thứ 1 khớp với 5, chấm thứ 2 khớp với 7).
Giải pháp tốt hơn là: dd[- /.]dd[- /.]dd. Regex này cho phép - hoặc space hoặc . hoặc / làm dấu phân cách ngày tháng năm. Lưu ý rằng dấu . trong lớp ký tự là 1 ký tự thông thường, do đó ko cần phải giải phóng. Nhưng regex này vẫn chưa hoàn hảo, nó sẽ coi 99/99/99 là 1 ngày hợp lệ.
Giải pháp tiếp theo: [0-1]d[- /.][0-3]d[- /.]dd. Ổn hơn nhưng vẫn chưa hoàn hảo, nó có thể khớp với 19/39/99.
Chất lượng của regex thế nào tuỳ thuộc vào yêu cầu của bạn. VD nếu muốn thẩm định thông tin nhập vào từ người dùng thì regex phải thật hoàn hảo. Còn nếu phân tích 1 file dữ liệu mà bạn đã biết chắc mã nguồn tạo ra file đó theo cách thức như thế nào thì regex có thể ở mức vừa đủ mà thôi.
Sử dụng lớp ký tự phủ định thay cho Dot
Hãy lấy 1 VD để tìm hiểu tại sao. Giả sử ta cần tìm 1 chuỗi bao bởi " ". Nghe có vẻ đơn giản như đang giỡn. Chuỗi này có thể có bao nhiêu ký tự tuỳ thích, do đó ".*" có vẻ ổn. Dấu . khớp với bất kỳ ký tự nào, còn dấu * sẽ cho phép . có thể dc nhắc lại bao nhiêu lần tuỳ thích, kể cả 0 lần. Nếu áp dụng regex này vào chuỗi Put a "string" between double quotes, nó sẽ trả về kết quả đúng như mong đợi: "string". Giờ hãy thử với chuỗi Houston, we have a problem with "string one" and "string two". Please respond. Và kết quả là "string one" and "string two", hỏng zồi. Lý do là vì * vốn có bản tính "tham lam" (greedy). Chi tiết thế nào thì hồi sau sẽ rõ. VD này cho thấy ko nên lạm dụng dấu chấm.
Trong VD tìm ngày ở trên, ta cải tiến regex bằng cách sử dụng lớp ký tự thay cho dấu chấm. Giờ ta cũng làm như vậy. Ta ko muốn có số lượng bất kỳ các ký tự bất kỳ trong cặp dấu " ", mà muốn có số lượng bất kỳ các ký tự ko phải là " hoặc newline trong cặp dấu " ". Do đó regex đúng sẽ là "[^"rn]*".
Mỏ neo (anchors)
Neo đầu và cuối chuỗi
Từ đầu đến giờ, ta đã tìm hiểu về các ký tự thông thường và lớp ký tự. Đặt 1 ký tự thông thường hoặc 1 lớp ký tự vào biểu thức regex, ta sẽ bắt regex engine đi so khớp với 1 ký tự đơn.
Mỏ neo thuộc về 1 dạng khác. Chúng ko so khớp với bất kỳ 1 ký tự nào. Thay vào đó, chúng so khớp với 1 vị trí trước, sau hoặc giữa các ký tự. Chúng dc sử dụng để "neo" biểu thức regex vào 1 vị trí để so khớp. Dấu ^ khớp với vị trí ngay trước ký tự đầu tiên trong chuỗi. Áp dụng regex ^a cho chuỗi abc, ta sẽ được a. ^b sẽ ko có kết quả khi so khớp với abc, vì b ko khớp với ký tự ngay sau vị trí bắt đầu của chuỗi, vị trí dc khớp bởi ^.
Tương tự như trên, $ khớp với vị trí ngay sau ký tự cuối cùng của chuỗi. c$ sẽ khớp với c trong abc, trong khi a$ ko khớp.
Thực hành
Khi sử dụng regex trong ngôn ngữ lập trình để kiểm định thông tin nhập vào từ người dùng, sử dụng neo là rất quan trọng. VD nếu ta dùng d+ để kiểm tra xem người dùng có nhập vào 1 số nguyên hay ko, kết quả trả về vẫn có thể là đúng thậm chí nếu người dùng nhập qsdf4ghjk, bởi d+ khớp với 4. Regex đúng ở đây phải là ^d+$. Bởi vì vị trí đầu chuỗi phải dc khớp trước khi d+ dc khớp, và vị trí cuối chuỗi phải dc khớp ngay sau đó, vì vậy chuỗi nhập vào nếu muốn khớp với ^d+$ thì chỉ có thể là 1 chuỗi các chữ số (dấu + là toán tử nhắc lại, dùng để nhắc lại ký tự trước nó 1 hoặc nhiều lần, chi tiết thì hồi sau sẽ rõ )
1 chú ý khác là ta có thể dễ dàng mắc lỗi với ký tự trắng. Trong ngôn ngữ Perl chẳng hạn, khi đọc vào 1 dòng từ 1 file text, ký tự line break cũng sẽ dc lưu vào biến. Do đó trước khi tiến hành kiểm định thông tin nhập vào, ta cần chặt bỏ các ký tự trắng đầu và cuối. ^s+ khớp với ký tự trắng đầu và s+$ khớp với ký tự trắng cuối.
Sử dụng ^ và $ để neo đầu và cuối 1 dòng
Nếu chuỗi cần xử lý dc viết trên nhiều dòng, như kiểu first linensecond line (n là ký tự line break), ta có thể muốn làm việc với từng dòng hơn là với cả chuỗi. Do đó, các regex engine dc thảo luận trong loạt bài này còn có thêm chức năng mở rộng ý nghĩa của các mỏ neo. ^ vừa có thể khớp với vị trí đầu chuỗi (trước ký tự f trong VD trên), vừa có thể khớp với vị trí ngay sau mỗi line break (giữa n và s). Cũng như vậy, $ vừa có thể khớp với vị trí cuối chuỗi (sau ký tự e cuối cùng), vừa có thể khớp với vị trí trước mỗi line break (giữa e và n).
Trong ngôn ngữ lập trình, ta phải kích hoạt chức năng mở rộng này, dc gọi là chế độ đa dòng (multi-line mode). VD trong Perl, ta làm việc này bằng cách thêm m vào sau đoạn mã regex, VD: m/^regex$/m;
Neo đầu và cuối chuỗi vĩnh cửu
A sẽ chỉ khớp với vị trí đầu chuỗi, và Z chỉ khớp với vị trí cuối chuỗi. Chúng ko bao giờ khớp ở vị trí các line break, thậm chí cả khi chế độ "multiline mode" dc kích hoạt. Điều này đúng cho tất cả các loại cú pháp regex dc thảo luận trong loạt bài này.
Match có độ dài 0 (Zero-Length Matches)
Ta đã biết các mỏ neo khớp với 1 vị trí chứ ko phải khớp với 1 ký tự. Điều này cũng có nghĩa là nếu biểu thức regex chỉ bao gồm 1 hoặc nhiều mỏ neo, kết quả so khớp có thể có độ dài 0. Tuỳ vào từng tình huống mà điều này có thể rất hữu dụng hoặc là tai họa. Chẳng hạn ta dử dụng ^d*$ để kiểm tra xem người dùng có nhập vào 1 số hay ko (chú ý ở đây ta dùng * thay cho + trong VD ở trên, * cũng là toán tử nhắc lại, dùng để nhắc lại ký tự trước nó 0 hoặc nhiều lần, chi tiết thì hồi sau sẽ rõ ). Điều này có thể dẫn tới việc chấp nhận 1 chuỗi rỗng là thông tin nhập vào hợp lệ.
Tuy nhiên, chỉ khớp với vị trí cũng có thể rất hữu dụng. VD như trong email, các dòng trong message trích dẫn thường dc bắt đầu bởi dấu > và space. Với chế độ "multi-line mode", ta có thể dùng regex ^ để "tóm" lấy với vị trí đầu của message trích dẫn, và vị trí ngay sau mỗi ký tự newline (đầu mỗi dòng trong message trích dẫn). Nhờ đó, khi sử dụng các hàm hay phương thức của ngôn ngữ lập trình, ta có thể loại bỏ kết quả so khớp (match) và thay thế vào đó chuỗi mà ta muốn (ở đây là chuỗi gồm ký tự > và space). Bởi vì kết quả so khớp ở đây ko chứa ký tự nào cả, cho nên ko có gì bị xoá đi. Nhưng nó chứa vị trí đầu các dòng trong message trích dẫn, do đó chuỗi >space sẽ được đặt vào đúng vị trí đó, điều mà ta muốn. VD trong PHP của chúng ta, đoạn mã này sẽ thêm >space vào đầu chuỗi:
echo preg_replace('/^/', '> ', 'I love LazyDog');
?>
Chuỗi kết thúc bởi Line Break
Mặc dù $ (khi ko kích hoạt "multi-line mode") và Z chỉ khớp với vị trí cuối chuỗi, nhưng có 1 ngoại lệ ở đây. Nếu chuỗi dc kết thúc bởi ký tự line break, khi đó Z và $ sẽ khớp với vị trí ngay trước ký tự line break, thay vì vị trí cuối chuỗi thực sự (sau line break). Tính năng tăng cường này dc đưa ra bởi Perl, và sau đó dc các loại cú pháp khác copy , bao gồm: Java, .NET và PCRE. Trong Perl, khi đọc vào 1 dòng từ file, chuỗi kết quả sẽ dc kết thúc bởi line break. VD khi đọc 1 dòng từ file chứa đoạn text lazydog, kết quả sẽ là lazydogn. Khi áp dùng regex vào chuỗi này, cả ^[a-z]+$ và A[a-z]+Z đều khớp với lazydog.
Nếu muốn khớp với vị trí cuối chuỗi thực sự, ta sử dụng z. A[a-z]+z sẽ ko khớp với lazydogn. Vì z khớp với vị trí sau line break, mà line break lại ko dc khớp bởi lớp ký tự [a-z].
Quan sát sự làm việc của Regex Engine
Hãy xem regex engine làm việc như thế nào khi ta khớp biểu thức ^4$ vào chuỗi 749n486n4 (n là ký tự newline) ở chế độ "multi-line mode".
Như bình thường, regex engine bắt đầu với ký tự đầu tiên: 7. Dấu hiệu (token) đầu tiên trong biểu thức regex là ^. Vì dấu hiệu này là dấu hiệu rỗng, nên engine sẽ ko cố khớp nó với 1 ký tự, thay vào đó nó sẽ khớp với 1 vị trí trước ký tự hiện hành. Và ^ dĩ nhiên sẽ khớp dc với vị trí trước 7. Engine sau đó sẽ tiếp tục xử lý dấu hiệu thứ 2 trong regex: 4. Vì dấu hiệu trước đó là rỗng, nên engine sẽ ko nhảy tới ký tự tiếp theo trong chuỗi mà vẫn dừng lại ở 7. 4 là ký tự thông thường, nó ko khớp với 7. Ko có khả năng nào khác ở đây, vì vậy engine phải bắt đầu lại từ đầu với dấu hiệu đầu tiên, và bây giờ xuất phát từ ký tự 4 trong chuỗi. Lần này, ^ ko thể khớp với vị trí trước 4. Vì phía trước vị trí này là 1 ký tự (7), và ký tự đó ko phải là newline. Engine lại làm lại từ đầu, từ ký tự 9, và lại thất bại. Lần thử tiếp theo, ở ký tự n, vẫn thất bại. Vì cũng như trên, phía trước vị trí trước n là 1 ký tự (9) và 9 ko phải là newline.
Engine tiếp tục làm lại từ đầu ở ký tự 4 (thứ hai) trong chuỗi. Bây giờ ^ đã có thể khớp với vị trí trước 4, vì trước vị trí này là 1 ký tự newline. Xong dấu hiệu thứ nhất, engine xử lý dấu hiệu thứ 2 của regex, 4, nhưng ko nhảy tới ký tự tiếp theo trong chuỗi. 4 khớp với 4. Giờ engine sẽ nhảy sang dấu hiệu thứ ba của regex và nhảy sang ký tự tiếp theo trong chuỗi. Nó cố gắng khớp $ với vị trí trước (chú ý: vẫn là trước) ký tự 8. $ ko thể khớp ở đây, vì vị trí này bị theo sau bởi 1 ký tự, và ký tự này ko phải là newline.
Engine tiếp tục kiên trì làm lại từ đầu. Lần trước, ^ đã dc khớp ở ký tự 4 (thứ hai), vì vậy lần này engine sẽ bắt đầu lại từ ký tự 8. ^ ko khớp với vị trí trước 8. Và cũng như vậy với ký tự 6 và n.
Lại làm lại, giờ engine cố khớp ^ ở ký tự 4 (thứ ba) của chuỗi. Trước vị trí trước 4 là ký tự n (newline). Vậy là thành công. Sau đó, engine tiếp tục khớp thành công 4 với 4. Giờ đến dấu hiệu cuối cùng là $, và ký tự cần so khớp bây giờ chính là 1 cái "ký tự"... chả có gì (void) nằm ở cuối chuỗi. Cứ theo nguyên tắc thì $ sẽ check vị trí phía trước cái "ký tự" này, và vị trí này dc theo sau bởi cái "ký tự" chả có gì đó, vậy là OK zồi . Nghĩa là, $ sẽ check chính cái ký tự hiện hành, nếu nó là ký tự newline hoặc "ký tự"... chả có j (hay đúng hơn là chả còn gì để mà check) thì so khớp sẽ thành công. Như vậy ở đây $ đã so khớp thành công.
Thế là cuối cùng, engine cũng đã tìm ra dc 1 match: đó là ký tự 4 cuối cùng trong chuỗi. Nghe có vẻ rắc rối nhưng thực chất hoạt động của engine hết sức logic và đơn giản.
1 quan sát khác
Ở phần trên ta đã thấy ^d*$ có thể khớp thành công với 1 chuỗi rỗng. Giờ hãy xem tại sao.
Chỉ có 1 "ký tự" duy nhất trong chuỗi rỗng: ký tự void cuối chuỗi (hay là chả có gì ). Dấu hiệu đầu tiên trong regex là ^. Nó khớp với vị trí trước ký tự void này, vì trước vị trí này là 1 ký tự void khác, ký tự void đầu chuỗi . Dấu hiệu tiếp theo của regex là d*. Engine sẽ cố khớp d với ký tự void cuối chuỗi, dĩ nhiên là thất bại. Nhưng nhờ có dấu * (nhắc lại ký tự trước nó 0 hoặc nhiều lần) cho nên lần so khớp này vẫn tìm ra dc 1 match (nhưng có độ dài 0). Engine lại tiếp tục tiến đến dấu hiệu cuối cùng $, và ký tự cần so khớp vẫn giữ nguyên, là ký tự void cuỗi chuỗi. Và như ta đã biết ở trên, so khớp này cũng thành công. Do đó, kết quả so khớp toàn bộ regex là 1 chuỗi rỗng, và engine sẽ thông báo là thành công

markdown:
#### Regular Expression
13:07PM 13/06/2011, Lập trình web
Regular Expressions là gì? Regular Expressions (Regex) dịch ra tiếng Việt là Biểu thức chính quy. Khái niệm này nằm trong 1 mớ lý thuyết vô cùng đồ sộ và hầm hố . Nhưng ko nên lo lắng, ta có thể hiểu nôm na Regex là 1 cái mẫu (pattern) dùng để mô tả 1 lớp ký tự nào đó.
VD: lazydog là 1 regex. Nó là 1 mẫu đơn giản nhất vì nó so khớp (match) với đoạn text lazydog. 1 match là 1 đoạn text so khớp với mẫu.
VD phức tạp hơn 1 chút: b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}b Đây là mẫu mô tả 1 địa chỉ email. Mẫu này có thể dc dùng để tìm 1 địa chỉ email trong 1 đoạn văn bản, hoặc kiểm tra xem 1 chuỗi có phải là địa chỉ email hợp lệ hay ko.
Regex có thể dc sử dụng với bất kỳ dữ liệu nào mà ta có thể truy cập, thông qua ứng dụng hoặc ngôn ngữ lập trình. Có thể kể đến 1 số ứng dụng xử lý văn bản hỗ trợ regex: PowerGREP, EditPad Pro, RegexBuddy,...
**Regular Expression Engines**
Regex engine là 1 bộ phận của phần mềm, chuyên để xử lý regex (so khớp mẫu với 1 chuỗi nào đó). Có nhiều regex engine và chúng ko hoàn toàn tương thích với nhau. Cú pháp regex (flavor) của mỗi engine cũng có sự khác nhau. Loạt bài này sẽ tập trung vào cú pháp regex dc sử dụng trong Perl 5, vì nó phổ biến nhất. Rất nhiều engine regex khác giống với engine sử dụng trong Perl 5: engine nguồn mở PCRE (sử dụng trong rất nhiều ngôn ngữ lập trình, như PHP, cái ta cần đây hehe ), thư viện regex .NET,...
OK vậy là ta đã hiểu sơ qua regex là cái gì, giờ để tấn công vào cái địa ngục này, ta cần có vũ khí. Có thể sử dụng 1 số ứng dụng xử lý text ở trên để thực hành các biểu thức regex, hoặc ko thì ta tự tạo lấy 1 cái thô sơ bằng PHP.
Trong PHP, ta có thể sử dụng biểu thức regex thông qua các hàm regex. PHP cung cấp 3 nhóm hàm regex, tên của chúng dc bắt đầu bởi: ereg, mb_ereg và preg. 2 loại đầu sử dụng engine POSIX Extended, còn preg sử dụng engine PCRE (Perl-Compatible). Vậy thì vũ khí của ta đơn giản chỉ là đoạn mã PHP sau:
$string = 'chuỗi cần áp dụng biểu thức regex';
$pattern = '/biểu thức regex/';
preg_match($pattern, $string, $match);
echo $match[0];
?>
Nó sẽ hiện lên màn hình kết quả so khớp biểu thức regex với chuỗi mà ta áp dụng regex vào. Như thấy ở trên, ta dùng nhóm hàm preg vì nó sử dụng engine PCRE rất giống với engine của Perl, loại engine có cú pháp mà ta đang thảo luận ở đây. Trong loạt bài này, ta sẽ qui ước màu sắc như trong đoạn mã trên: red cho biểu thức regex, green cho chuỗi áp dụng regex, và blue cho kết quả so khớp.
**Ký tự thông thường và ký tự đặc biệt**
**Ký tự thông thường (Literal Characters)**
Regex cơ bản nhất chính là biểu thức bao gồm 1 ký tự thông thường, VD: a. Nó sẽ so khớp với thực thể đầu tiên của ký tự đó trong chuỗi. VD nếu có chuỗi: LazyDog is a boy, nó sẽ so khớp với ký tự a sau ký tự L. Regex này cũng có thể so khớp với ký tự a thứ 2 nếu ta điều khiển regex engine tiếp tục tìm kiếm sau khi đã so khớp dc 1 lần.
Cũng như vậy, regex dog sẽ so khớp với dog trong chuỗi LazyDog is not a dog. Regex này bao gồm 1 sêri 3 ký tự thông thường. Engine sẽ hiểu biểu thức này là: tìm d, theo sau bởi o, theo sau bởi g.
Chú ý rằng regex engine mặc định phân biệt chữ hoa và chữ thường. Dog ko so khớp với dog.
*Ký tự đặc biệt (Special Characters)*
Vì ta cần làm nhiều công việc phức tạp hơn là tìm kiếm 1 đoạn văn bản, cho nên phải trưng dụng 1 vài ký tự để làm những nhiệm vụ đặc biệt. Trong cú pháp regex dc thảo luận ở đây, có 11 ký tự mang ý nghĩa đặc biệt: [ ^ $ . | ? * + ( ). Chúng dc gọi là các metacharacter.
Nếu cần dùng các ký tự này với ý nghĩa thông thường, ta phải giải phóng nó bằng . VD nếu cần so khớp 1+1=2, thì regex đúng sẽ là 1+1=2. Chú ý rằng 1+1=2 cũng là regex đúng, nên sẽ ko báo lỗi, nhưng nó sẽ ko cho ta kết quả như mong muốn. Regex 1+1=2 sẽ so khớp với 111=2 trong chuỗi 123+111=234, vì dấu + ở đây mang ý nghĩa đặc biệt.
Nếu ta quên ko giải phóng ký tự đặc biệt ở những chỗ nó ko dc phép đứng thì sẽ gặp lỗi. VD: +1
Hầu hết các loại cú pháp regex đều coi { như 1 ký tự thông thường, trừ khi nó là 1 phần của toán tử nhắc lại (repetition operator), VD: {1, 3}. Vì vậy ta ko cần giải phóng ký tự này.
Ta chỉ dùng để giải phóng các ký tự đặc biệt, còn các ký tự khác thì ko nên, vì cũng là 1 ký tự đặc biệt. khi kết hợp với 1 ký tự thông thường sẽ có ý nghĩa đặc biệt, VD: d sẽ so khớp với 1 chữ số từ 0 - 9.
Tất cả các loại cú pháp regex đều cho phép giải phóng 1 ký tự đặc biệt bằng . Rất nhiều cú pháp khác còn hỗ trợ kiểu giải phóng Q... E. Tất cả các ký tự nằm trong cặp Q và E sẽ dc coi như ký tự thông thường. VD: Q*d+*E sẽ so khớp với đoạn văn bản *d+* . Kiểu cú pháp này dc hỗ trợ bởi JGsoft engine, Perl, PCRE, ...
*Ký tự đặc biệt và ngôn ngữ lập trình*
Khác với trong ngôn ngữ lập trình, trong regex, ký tự ' và " ko phải là ký tự đặc biệt. Vì vậy, ko cần phải giải phóng nó.
Trong mã nguồn của 1 chương trình, cần luôn ghi nhớ những ký tự nào dc ngôn ngữ lập trình xử lý đặc biệt. Bởi vì những ký tự này sẽ dc trình biên dịch xử lý trước khi dc engine regex xử lý. VD: regex 1+1=2 phải dc viết thành 1+1=2 trong mã nguồn C++. Trình biên dịch C++ sẽ chuyển thành trong chuỗi trên, sau đó nó mới dc chuyển đến regex engine. VD khác: đế so khớp c:temp, cần dùng regex c: emp (vì t trong regex mang ý nghĩa đặc biệt). Và trong mã nguồn C++, regex này cần dc viết là c:\temp. Đúng là địa ngục . Ko bit trong PHP của chúng ta thì thế nào đây hic :'(.
*Ký tự ko in được*
Có thể dùng các tổ hợp ký tự đặc biệt để đặt các ký tự ko in dc vào regex.
t cho ký tự tab (ASCII 0x09)
r cho carriage return (0x0D)
n cho line feed (0x0A).
a (bell, 0x07)
e (escape, 0x1B)
f (form feed, 0x0C)
v (vertical tab, 0x0B).
Chú ý rằng Windows text files sử dụng rn để kết thúc dòng, còn UNIX text files sử dụng n.
Có thể dùng cách này để viết bất kỳ ký tự nào nếu biết mã 16 ASCII của ký tự đó trong bảng mã đang dùng. VD trong bảng mã Latin-1, ký tự copyright có mã 0xA9. Vì thế để tìm ký tự này, ta dùng xA9.
Hầu hết các loại cú pháp regex còn cho phép sử dụng tổ hợp cA đến cZ (c cố định, theo sau bởi 1 chữ cái hoa từ A - Z) để biểu thị ký tự điều khiển. VD cA biểu thị Control+A. cM biểu thị Control+M, hay carriage return, giống như r.
Nếu regex engine hỗ trợ Unicode, ta sử dụng uFFFF thay cho xFF để biểu thị 1 ký tự Unicode. VD: mã unicode của ký tự đồng euro là 0x20AC. Để đặt nó vào biểu thức regex, ta dùng u20AC.
**Regex Engine làm việc như thế nào?**
Hiểu dc cách làm việc của regex engine sẽ giúp ta viết regex tốt hơn, dễ dàng hơn. Nó giúp ta hiểu dc tại sao 1 regex hoạt động ko như mong muốn, và giúp tiết kiệm thời gian phải mò mẫm khi viết các regex phức tạp.
Có 2 loại regex engine: text-directed engines, và regex-directed engines. Loại cú pháp regex mà ta đang thảo luận ở đây thuộc loại regex-directed engines. Loại engine này phổ biến hơn bởi nó có 1 số chức năng rất hữu dụng như: lazy quantifiers, backreferences,...
Có thể dễ dàng kiểm tra xem loại cú pháp đang sử dụng thuộc về engine nào qua việc kiểm tra xem lazy quantifiers và backreferences có dc hỗ trợ ko. Hãy thử dùng biểu thức regex regex|regex not vào chuỗi regex not xem sao. Nếu kết quả so khớp là regex, thì engine đang dùng thuộc loại regex-directed. Nêu kết quả là regex not, thì engine thuộc loại text-directed. Tại sao lại thế thì hồi sau sẽ rõ
Trong các VD ở các bài tiếp theo, ta sẽ phân tích cụ thể cách thức làm việc của regex engine, qua đó giúp sử dụng regex hiệu quả nhất và tránh mắc lỗi.
**Regex-directed engine luôn trả về kết quả so khớp bên trái nhất**
Thậm chí nếu 1 match tốt hơn có thể dc tìm thấy nếu tiếp tục so khớp. Đây là điều cần ghi nhớ. Regex-directed engine luôn bắt đầu so khớp với ký tự đầu tiên của chuỗi.
Hãy lấy 1 VD đơn giản nhất để minh hoạ: ta dùng regex cat vào chuỗi He captured a catfish for his cat. Engine sẽ bắt đầu so khớp dấu hiện đầu tiên trong regex là c với ký tự đầu tiên của chuỗi là H. Ko khớp. Vì vậy nó tiếp tục lần lượt so khớp với ký tự thứ 2 và 3 là e và space. Đều ko khớp. Đến ký tự thứ 4, c đã khớp với c. Xong, giờ engine bắt đầu so khớp dấu hiệu thứ 2 trong regex là a với ký tự thứ 5 của chuỗi là a. Khớp. Nhưng đến dấu hiệu thứ 3 của regex là t thì ko khớp với ký tự thứ 6 của chuỗi là p. Lúc này engine ngộ ra rằng ko thể tìm ra 1 match bắt đầu từ ký tự thứ 4 của chuỗi. Vì vậy, nó bắt đầu lại công việc từ đầu, từ ký tự thứ 5 của chuỗi. Regex c ko khớp với a. Cứ tiếp tục như vậy cho đến ký tự thứ 15 của chuỗi, regex c đã khớp với c. Engine lần lượt so khớp các dấu hiệu còn lại trong regex với các ký tự tiếp theo trong chuỗi: a khớp a, t khớp t. Và như vậy 1 match đã dc tìm thấy bắt đầu từ ký tự 15. Engine sẽ trả về kết quả và ngừng luôn, ko tiếp tục tìm xem còn match nào tốt hơn ko (VD: cat ở cuối chuỗi).
**Lớp ký tự (Character Classes - Character Sets)**
*Lớp ký tự*
Sử dụng lớp ký tự, ta sẽ khiến regex engine chỉ chọn ra 1 ký tự để so khớp. Để sử dụng, ta đặt các ký tự cần so khớp vào 2 dấu [ và ]. VD: để so khớp ký tự a hoặc e, ta dùng [ae]. Như vậy biểu thức gr[ae]y sẽ khớp với gray hoặc grey.
Lớp ký tự chỉ so khớp với 1 ký tự đơn. Như vậy gr[ae]y sẽ ko khớp với graay, graey,v.v... Thứ tự các ký tự trong lớp ko quan trọng. Kết quả trả về luôn giống nhau.
Để xác định 1 vùng ký tự trong lớp ký tự, ta sử dụng dấu - . VD: [0-9] so khớp với 1 chữ số từ 0 - 9. Có thể sử dụng nhiều vùng ký tự hoặc kết hợp vùng ký tự với ký tự đơn. VD: [0-9a-fA-F] so khớp với 1 chữ số hệ 16, ko phân biệt chữ hoa, thường. [0-9a-fxA-FX] so khớp với 1 chữ số hệ 16 hoặc chữ cái X, ko phân biệt chữ hoa, thường. Cũng như trên, thứ tự các vùng ko quan trọng.
*Lớp ký tự phủ định*
Đặt dấu ^ sau [ trong lớp ký tự sẽ phủ định lớp ký tự đó. Kết quả là lớp ký tự sẽ so khớp với bất kỳ ký tự nào ko nằm trong lớp ký tự đó. Lớp ký tự phủ định có thể so khớp với cả ký tự line break.
Chú ý rằng lớp ký tự phủ định vẫn phải dc so khớp với 1 ký tự. VD: q[^u] ko phải là "q ko theo sau bởi u" mà là "q theo sau bởi 1 ký tự ko phải u". Vì vậy nó sẽ ko so khớp với q trong chuỗi Iraq, và sẽ so khớp với q và space trong chuỗi Iraq is a country.
*Metacharacter trong lớp ký tự*
Trong lớp ký tự, các ký tự mang ý nghĩa đặc biệt hay metacharacter chỉ bao gồm: ] ^ -. Các metacharacter nói ở phần trước khi đặt trong lớp ký tự sẽ chỉ dc coi như ký tự thông thường, và do đó ko cần phải giải phóng. VD: để tìm ký tự * hoặc +, ta dùng [+*].
Để đặt ký tự vào trong lớp ký tự với nghĩa thông thường, cần giải phóng nó bằng 1 ký tự khác. VD: [x] sẽ khơp với ký tự hoặc x. Các ký tự ] ^ - nếu muốn dùng theo nghĩa thông thường cũng phải dc giải phóng bằng hoặc đặt nó ở vị trí mà nó sẽ ko có ý nghĩa đặc biệt. Ta nên dùng cách thứ 2 để biểu thức regex trông dễ nhìn hơn như sau:
Với ^, đặt nó ở bất kỳ chỗ nào trừ vị trí ngay sau [ . VD: [x^] sẽ khớp với x hoặc ^.
Với ], đặt nó ngay sau [ hoặc [^ . VD: []x] sẽ khớp với ] hoặc x. [^]x] sẽ khớp với bất kỳ ký tự nào ko phải là ] hoặc x.
Với -, đặt nó ngay sau [ hoặc [^ , hoặc ngay trước ]. VD: cả [-x] và [x-] đều so khớp với - hoặc x.
Có thể sử dụng tất cả các ký tự ko in dc trong lớp ký tự giống như dùng chúng ngoài lớp ký tự. VD: [$u20AC] sẽ khớp với $ hoặc ký tự đồng euro (với giả định cú pháp regex đang dùng hỗ trợ unicode).
JGsoft engine, Perl và PCRE còn hỗ trợ kiểu Q...E trong lớp ký tự để giải phóng 1 chuỗi ký tự. VD: [Q[-]E] sẽ khớp với [ hoặc - hoặc ].
Cú pháp regex của POSIX lại xử lý trong lớp ký tự như 1 ký tự thông thường. Đồng nghĩa với việc ta ko thể dùng để giải phóng ] ^ -. Để làm việc này ta chỉ còn cách đặt chúng vào các vị trí như trình bày ở trên. Ngoài ra điều này cũng đồng nghĩa với việc các cú pháp tắt (shorthand, VD: d) ko còn hiệu lực.
*Lớp ký tự viết tắt (Shorthand Character Classes)*
d là dạng tắt của [0-9].
w dc gọi là "ký tự từ" (word character). Chính xác những ký tự nào dc khớp với nó thay đổi tuỳ theo mỗi loại cú pháp regex. Trong tất cả các loại cú pháp, nó sẽ bao gồm [A-Za-z]. Trong hầu hết các loại cú pháp, nó cũng bao gồm cả dấu _ và chữ số.
s dc gọi là "ký tự trắng" (whitespace character). Nó khớp với ký tự nào thì cũng tùy thuộc vào từng loại cú pháp. Trong kiểu cú pháp thảo luận ở đây, nó bao gồm [t]. Nghĩa là s sẽ khớp với space hoặc tab. Trong hầu hết cú pháp , nó cũng bao gồm cả ký tự carriage return hoặc line feed, nghĩa là [trn]. Một số cú pháp khác lại bao gồm thêm cả các ký tự ko in dc hiếm khi dùng như vertical tab hoặc form feed.
Các lớp ký tự viết tắt có thể dc dùng cả trong lẫn ngoài cặp []. VD: sd khớp với 1 ký tự trắng theo sau bởi 1 chữ số. [sd] khớp với 1 ký tự đơn là 1 ký tự trắng hoặc 1 chữ số. Khi áp dụng vào chuỗi 1 + 2 = 3, regex thứ 1 sẽ khớp với 2 (space và 2), trong khi regex thứ 2 sẽ khớp với 1. [da-fA-F] khớp với 1 chữ số hệ 16, giống như [0-9a-fA-F].
*Lớp ký tự viết tắt phủ định (Negated Shorthand Character Classes)*
D tương đương [^d]
W tương đương [^w]
S tương đương [^s]
Cần thận trọng khi sử dụng dạng viết tắt phủ địng bên trong []. [DS] khác với [^ds]. Regex thứ 2 sẽ khớp với bất kỳ ký tự nào ko phải là chữ số hoặc ký tự trắng. Còn regex thứ 1 sẽ khớp với bất kỳ ký tự nào ko phải là chữ số hoặc ko phải là ký tự trắng. Và vì chữ số ko phải là ký tự trắng và ký tự trắng ko phải là chữ số cho nên [DS] sẽ khớp với bất kỳ ký tự nào, bao gồm cả ký tự trắng và chữ số .
*Nhắc lại lớp ký tự (Repeating Character Classes)*
Nếu nhắc lại lớp ký tự khi dùng các toán tử nhắc lại ? * + , ta sẽ nhắc lại cả lớp ký tự chứ ko chỉ nhắc lại ký tự mà nó so khớp. VD: regex [0-9]+ sẽ khớp với cả 837 lẫn 222.
Nếu muốn nhắc lại chỉ các ký tự dc so khớp, ta cần dùng tham chiếu ngược (backreferences). ([0-9])1+ sẽ khớp với 222 chứ ko khớp với 837. Khi áp dùng regex này vào chuỗi 833337, nó sẽ khớp với 3333. Chi tiết hơn thì hồi sau sẽ rõ
**Ký tự chấm (Dot)**
*Ký tự Dot khớp với hầu hết các ký tự*
Trong biểu thức regex, dấu . là metacharacter dc sử dụng nhiều nhất, và cũng là ký tự bị sử dụng sai nhiều nhất.
Dấu . khớp với 1 ký tự đơn bất kỳ ngoại trừ ký tự newline. Vì vậy, dấu . tương đương với [^n] (trong UNIX) hoặc [^rn] (trong Windows).
Trong Perl, dấu . có thể khớp với cả newline nếu ta dùng chế độ "single-line mode". Để sử dụng chế độ này, ta thêm s vào sau biểu thức regex, VD: m/^regex$/s;
JavaScript và VBScript ko có chế độ nào hỗ trợ Dot so khớp với các ký tự line break. Vì vậy, để so khớp với bất kỳ ký tự nào ta phải dùng [sS] thay cho Dot. [sS] so khớp với 1 ký tự là ký tự trắng (bao gồm cả các ký tự line break) hoặc ko phải ký tự trắng, nghĩa là nó so khớp với bất kỳ ký tự nào.
*Sử dụng Dot 1 cách tiết kiệm*
Dấu . là 1 metacharacter đầy uy lực. Nó có thể khớp với bất kỳ ký tự nào, nhưng cũng có thể khớp với ký tự mà ta ko muốn. Những trường hợp như thế có thế rất khó nhận ra.
Hãy lấy 1 VD đơn giản để minh hoạ: giải sử ta muốn tìm 1 chuỗi ngày tháng năm dưới dạng mm/dd/yy, trong đó dấu phân cách ngày tháng năm ta để người dùng tuỳ chọn. Giải pháp nhanh nhất là dd.dd.dd. Trông có vẻ ổn. Nó sẽ khớp 1 chuỗi kiểu như 02/12/03. Vấn đề là 1 chuỗi kiểu như 02512703 cũng dc coi là 1 ngày hợp lệ với regex trên (chấm thứ 1 khớp với 5, chấm thứ 2 khớp với 7).
Giải pháp tốt hơn là: dd[- /.]dd[- /.]dd. Regex này cho phép - hoặc space hoặc . hoặc / làm dấu phân cách ngày tháng năm. Lưu ý rằng dấu . trong lớp ký tự là 1 ký tự thông thường, do đó ko cần phải giải phóng. Nhưng regex này vẫn chưa hoàn hảo, nó sẽ coi 99/99/99 là 1 ngày hợp lệ.
Giải pháp tiếp theo: [0-1]d[- /.][0-3]d[- /.]dd. Ổn hơn nhưng vẫn chưa hoàn hảo, nó có thể khớp với 19/39/99.
Chất lượng của regex thế nào tuỳ thuộc vào yêu cầu của bạn. VD nếu muốn thẩm định thông tin nhập vào từ người dùng thì regex phải thật hoàn hảo. Còn nếu phân tích 1 file dữ liệu mà bạn đã biết chắc mã nguồn tạo ra file đó theo cách thức như thế nào thì regex có thể ở mức vừa đủ mà thôi.
*Sử dụng lớp ký tự phủ định thay cho Dot*
Hãy lấy 1 VD để tìm hiểu tại sao. Giả sử ta cần tìm 1 chuỗi bao bởi " ". Nghe có vẻ đơn giản như đang giỡn. Chuỗi này có thể có bao nhiêu ký tự tuỳ thích, do đó ".*" có vẻ ổn. Dấu . khớp với bất kỳ ký tự nào, còn dấu * sẽ cho phép . có thể dc nhắc lại bao nhiêu lần tuỳ thích, kể cả 0 lần. Nếu áp dụng regex này vào chuỗi Put a "string" between double quotes, nó sẽ trả về kết quả đúng như mong đợi: "string". Giờ hãy thử với chuỗi Houston, we have a problem with "string one" and "string two". Please respond. Và kết quả là "string one" and "string two", hỏng zồi. Lý do là vì * vốn có bản tính "tham lam" (greedy). Chi tiết thế nào thì hồi sau sẽ rõ. VD này cho thấy ko nên lạm dụng dấu chấm.
Trong VD tìm ngày ở trên, ta cải tiến regex bằng cách sử dụng lớp ký tự thay cho dấu chấm. Giờ ta cũng làm như vậy. Ta ko muốn có số lượng bất kỳ các ký tự bất kỳ trong cặp dấu " ", mà muốn có số lượng bất kỳ các ký tự ko phải là " hoặc newline trong cặp dấu " ". Do đó regex đúng sẽ là "[^"rn]*".
**Mỏ neo (anchors)**
*Neo đầu và cuối chuỗi*
Từ đầu đến giờ, ta đã tìm hiểu về các ký tự thông thường và lớp ký tự. Đặt 1 ký tự thông thường hoặc 1 lớp ký tự vào biểu thức regex, ta sẽ bắt regex engine đi so khớp với 1 ký tự đơn.
Mỏ neo thuộc về 1 dạng khác. Chúng ko so khớp với bất kỳ 1 ký tự nào. Thay vào đó, chúng so khớp với 1 vị trí trước, sau hoặc giữa các ký tự. Chúng dc sử dụng để "neo" biểu thức regex vào 1 vị trí để so khớp. Dấu ^ khớp với vị trí ngay trước ký tự đầu tiên trong chuỗi. Áp dụng regex ^a cho chuỗi abc, ta sẽ được a. ^b sẽ ko có kết quả khi so khớp với abc, vì b ko khớp với ký tự ngay sau vị trí bắt đầu của chuỗi, vị trí dc khớp bởi ^.
Tương tự như trên, $ khớp với vị trí ngay sau ký tự cuối cùng của chuỗi. c$ sẽ khớp với c trong abc, trong khi a$ ko khớp.
*Thực hành*
Khi sử dụng regex trong ngôn ngữ lập trình để kiểm định thông tin nhập vào từ người dùng, sử dụng neo là rất quan trọng. VD nếu ta dùng d+ để kiểm tra xem người dùng có nhập vào 1 số nguyên hay ko, kết quả trả về vẫn có thể là đúng thậm chí nếu người dùng nhập qsdf4ghjk, bởi d+ khớp với 4. Regex đúng ở đây phải là ^d+$. Bởi vì vị trí đầu chuỗi phải dc khớp trước khi d+ dc khớp, và vị trí cuối chuỗi phải dc khớp ngay sau đó, vì vậy chuỗi nhập vào nếu muốn khớp với ^d+$ thì chỉ có thể là 1 chuỗi các chữ số (dấu + là toán tử nhắc lại, dùng để nhắc lại ký tự trước nó 1 hoặc nhiều lần, chi tiết thì hồi sau sẽ rõ )
1 chú ý khác là ta có thể dễ dàng mắc lỗi với ký tự trắng. Trong ngôn ngữ Perl chẳng hạn, khi đọc vào 1 dòng từ 1 file text, ký tự line break cũng sẽ dc lưu vào biến. Do đó trước khi tiến hành kiểm định thông tin nhập vào, ta cần chặt bỏ các ký tự trắng đầu và cuối. ^s+ khớp với ký tự trắng đầu và s+$ khớp với ký tự trắng cuối.
*Sử dụng ^ và $ để neo đầu và cuối 1 dòng*
Nếu chuỗi cần xử lý dc viết trên nhiều dòng, như kiểu first linensecond line (n là ký tự line break), ta có thể muốn làm việc với từng dòng hơn là với cả chuỗi. Do đó, các regex engine dc thảo luận trong loạt bài này còn có thêm chức năng mở rộng ý nghĩa của các mỏ neo. ^ vừa có thể khớp với vị trí đầu chuỗi (trước ký tự f trong VD trên), vừa có thể khớp với vị trí ngay sau mỗi line break (giữa n và s). Cũng như vậy, $ vừa có thể khớp với vị trí cuối chuỗi (sau ký tự e cuối cùng), vừa có thể khớp với vị trí trước mỗi line break (giữa e và n).
Trong ngôn ngữ lập trình, ta phải kích hoạt chức năng mở rộng này, dc gọi là chế độ đa dòng (multi-line mode). VD trong Perl, ta làm việc này bằng cách thêm m vào sau đoạn mã regex, VD: m/^regex$/m;
*Neo đầu và cuối chuỗi vĩnh cửu*
A sẽ chỉ khớp với vị trí đầu chuỗi, và Z chỉ khớp với vị trí cuối chuỗi. Chúng ko bao giờ khớp ở vị trí các line break, thậm chí cả khi chế độ "multiline mode" dc kích hoạt. Điều này đúng cho tất cả các loại cú pháp regex dc thảo luận trong loạt bài này.
*Match có độ dài 0 (Zero-Length Matches)*
Ta đã biết các mỏ neo khớp với 1 vị trí chứ ko phải khớp với 1 ký tự. Điều này cũng có nghĩa là nếu biểu thức regex chỉ bao gồm 1 hoặc nhiều mỏ neo, kết quả so khớp có thể có độ dài 0. Tuỳ vào từng tình huống mà điều này có thể rất hữu dụng hoặc là tai họa. Chẳng hạn ta dử dụng ^d*$ để kiểm tra xem người dùng có nhập vào 1 số hay ko (chú ý ở đây ta dùng * thay cho + trong VD ở trên, * cũng là toán tử nhắc lại, dùng để nhắc lại ký tự trước nó 0 hoặc nhiều lần, chi tiết thì hồi sau sẽ rõ ). Điều này có thể dẫn tới việc chấp nhận 1 chuỗi rỗng là thông tin nhập vào hợp lệ.
Tuy nhiên, chỉ khớp với vị trí cũng có thể rất hữu dụng. VD như trong email, các dòng trong message trích dẫn thường dc bắt đầu bởi dấu > và space. Với chế độ "multi-line mode", ta có thể dùng regex ^ để "tóm" lấy với vị trí đầu của message trích dẫn, và vị trí ngay sau mỗi ký tự newline (đầu mỗi dòng trong message trích dẫn). Nhờ đó, khi sử dụng các hàm hay phương thức của ngôn ngữ lập trình, ta có thể loại bỏ kết quả so khớp (match) và thay thế vào đó chuỗi mà ta muốn (ở đây là chuỗi gồm ký tự > và space). Bởi vì kết quả so khớp ở đây ko chứa ký tự nào cả, cho nên ko có gì bị xoá đi. Nhưng nó chứa vị trí đầu các dòng trong message trích dẫn, do đó chuỗi >space sẽ được đặt vào đúng vị trí đó, điều mà ta muốn. VD trong PHP của chúng ta, đoạn mã này sẽ thêm >space vào đầu chuỗi:
echo preg_replace('/^/', '> ', 'I love LazyDog');
?>
*Chuỗi kết thúc bởi Line Break*
Mặc dù $ (khi ko kích hoạt "multi-line mode") và Z chỉ khớp với vị trí cuối chuỗi, nhưng có 1 ngoại lệ ở đây. Nếu chuỗi dc kết thúc bởi ký tự line break, khi đó Z và $ sẽ khớp với vị trí ngay trước ký tự line break, thay vì vị trí cuối chuỗi thực sự (sau line break). Tính năng tăng cường này dc đưa ra bởi Perl, và sau đó dc các loại cú pháp khác copy , bao gồm: Java, .NET và PCRE. Trong Perl, khi đọc vào 1 dòng từ file, chuỗi kết quả sẽ dc kết thúc bởi line break. VD khi đọc 1 dòng từ file chứa đoạn text lazydog, kết quả sẽ là lazydogn. Khi áp dùng regex vào chuỗi này, cả ^[a-z]+$ và A[a-z]+Z đều khớp với lazydog.
Nếu muốn khớp với vị trí cuối chuỗi thực sự, ta sử dụng z. A[a-z]+z sẽ ko khớp với lazydogn. Vì z khớp với vị trí sau line break, mà line break lại ko dc khớp bởi lớp ký tự [a-z].
*Quan sát sự làm việc của Regex Engine*
Hãy xem regex engine làm việc như thế nào khi ta khớp biểu thức ^4$ vào chuỗi 749n486n4 (n là ký tự newline) ở chế độ "multi-line mode".
Như bình thường, regex engine bắt đầu với ký tự đầu tiên: 7. Dấu hiệu (token) đầu tiên trong biểu thức regex là ^. Vì dấu hiệu này là dấu hiệu rỗng, nên engine sẽ ko cố khớp nó với 1 ký tự, thay vào đó nó sẽ khớp với 1 vị trí trước ký tự hiện hành. Và ^ dĩ nhiên sẽ khớp dc với vị trí trước 7. Engine sau đó sẽ tiếp tục xử lý dấu hiệu thứ 2 trong regex: 4. Vì dấu hiệu trước đó là rỗng, nên engine sẽ ko nhảy tới ký tự tiếp theo trong chuỗi mà vẫn dừng lại ở 7. 4 là ký tự thông thường, nó ko khớp với 7. Ko có khả năng nào khác ở đây, vì vậy engine phải bắt đầu lại từ đầu với dấu hiệu đầu tiên, và bây giờ xuất phát từ ký tự 4 trong chuỗi. Lần này, ^ ko thể khớp với vị trí trước 4. Vì phía trước vị trí này là 1 ký tự (7), và ký tự đó ko phải là newline. Engine lại làm lại từ đầu, từ ký tự 9, và lại thất bại. Lần thử tiếp theo, ở ký tự n, vẫn thất bại. Vì cũng như trên, phía trước vị trí trước n là 1 ký tự (9) và 9 ko phải là newline.
Engine tiếp tục làm lại từ đầu ở ký tự 4 (thứ hai) trong chuỗi. Bây giờ ^ đã có thể khớp với vị trí trước 4, vì trước vị trí này là 1 ký tự newline. Xong dấu hiệu thứ nhất, engine xử lý dấu hiệu thứ 2 của regex, 4, nhưng ko nhảy tới ký tự tiếp theo trong chuỗi. 4 khớp với 4. Giờ engine sẽ nhảy sang dấu hiệu thứ ba của regex và nhảy sang ký tự tiếp theo trong chuỗi. Nó cố gắng khớp $ với vị trí trước (chú ý: vẫn là
**trước**) ký tự 8. $ ko thể khớp ở đây, vì vị trí này bị **theo sau** bởi 1 ký tự, và ký tự này ko phải là newline.
Engine tiếp tục kiên trì làm lại từ đầu. Lần trước, ^ đã dc khớp ở ký tự 4 (thứ hai), vì vậy lần này engine sẽ bắt đầu lại từ ký tự 8. ^ ko khớp với vị trí trước 8. Và cũng như vậy với ký tự 6 và n.
Lại làm lại, giờ engine cố khớp ^ ở ký tự 4 (thứ ba) của chuỗi. Trước vị trí trước 4 là ký tự n (newline). Vậy là thành công. Sau đó, engine tiếp tục khớp thành công 4 với 4. Giờ đến dấu hiệu cuối cùng là $, và ký tự cần so khớp bây giờ chính là 1 cái "ký tự"... chả có gì (void) nằm ở cuối chuỗi. Cứ theo nguyên tắc thì $ sẽ check vị trí phía trước cái "ký tự" này, và vị trí này dc theo sau bởi cái "ký tự" chả có gì đó, vậy là OK zồi . Nghĩa là, $ sẽ check chính cái ký tự hiện hành, nếu nó là ký tự newline hoặc "ký tự"... chả có j (hay đúng hơn là chả còn gì để mà check) thì so khớp sẽ thành công. Như vậy ở đây $ đã so khớp thành công.
Thế là cuối cùng, engine cũng đã tìm ra dc 1 match: đó là ký tự 4 cuối cùng trong chuỗi. Nghe có vẻ rắc rối nhưng thực chất hoạt động của engine hết sức logic và đơn giản.
*1 quan sát khác*
Ở phần trên ta đã thấy ^d*$ có thể khớp thành công với 1 chuỗi rỗng. Giờ hãy xem tại sao.
Chỉ có 1 "ký tự" duy nhất trong chuỗi rỗng: ký tự void cuối chuỗi (hay là chả có gì ). Dấu hiệu đầu tiên trong regex là ^. Nó khớp với vị trí trước ký tự void này, vì trước vị trí này là 1 ký tự void khác, ký tự void đầu chuỗi . Dấu hiệu tiếp theo của regex là d*. Engine sẽ cố khớp d với ký tự void cuối chuỗi, dĩ nhiên là thất bại. Nhưng nhờ có dấu * (nhắc lại ký tự trước nó 0 hoặc nhiều lần) cho nên lần so khớp này vẫn tìm ra dc 1 match (nhưng có độ dài 0). Engine lại tiếp tục tiến đến dấu hiệu cuối cùng $, và ký tự cần so khớp vẫn giữ nguyên, là ký tự void cuỗi chuỗi. Và như ta đã biết ở trên, so khớp này cũng thành công. Do đó, kết quả so khớp toàn bộ regex là 1 chuỗi rỗng, và engine sẽ thông báo là thành công

X-UA-Compatible: IE=edge

Cache-Control: public


text:
Làm thiết kế đồ họa, ngoài kỹ năng và kiến thức về đồ họa của bản thân thì designer còn cần phải biết cập nhật nhiều kiến thức và ý tưởng khác nhau về đô họa để phục vụ cho việc làm thiết kế của mình. Các website dưới đây cung cấp cho bạn kho kiến thức về đồ họa rất cần thiết và bổ ích.
2. Fontchu.com- Website fonts chữ số 1 Việt Nam
– Download hơn 2000 font tiếng Việt đẹp miễn phí.
– Đầy đủ các font chữ tiếng Việt: font VNI, font Unicode, font thư pháp, font ABC
– Tốc độ tải phông chữ nhanh, nhiều công cụ, phần mềm hỗ trợ font vn
– Font chữ đẹp để design, font nước ngoài: tiếng Trung, Nhật Hàn
Tất cả những cái trên là do website này “tự giới thiệu” tôi chỉ copy lại mà thôi…
3. 1kho.com – Cần là có, mò là thấy
Cái câu slogan của website này khá là “xì-teen” nhưng tin tôi đi trang web này có đủ mọi thứ trên đời (nói hơi quá nhưng khi bạn tìm một cái gì đó thì nên tạt qua trang này trước khi tìm ở các trang khác). Nhưng…để download được thì chúng ta phải tốn phí và không được dùng các chương trình hỗ trợ download như Internet Download Manager,…
4. Search Free Fonts
– Trang web gồm rất nhiều loại font như : nghệ thuật, 3D, hài hước….
5. Da Fonts
– Chứa các loại font như : cơ bản (Sans serif, serif…), valentine..
6. 1001 Free Fonts
– Đúng như tên của trang web, các loại font rất đa dạng như : 3D, động vật, máy tính…
7. Fontica
– Tất cả các font được sắp xếp theo bảng chữ cái từ A-Z
8. Abstract Fonts
– Với số lượng khổng lồ gần 13000 font, bạn sẽ tìm được loại font bạn cần một cách dễ dàng và hoàn toàn miễn phí.
9. Cream Undo
– Bạn có thể gõ đoạn chữ bạn muốn để xem trước loại font bạn cần bằng cách nhập vào ô trống rồi nhấn nút View text.
10. Font Cubes
– Các loại font cách điệu và phong cách
11. Font Stock
– Có cả các loại font miễn phí và trả phí được sắp xếp theo thứ tự từ 0-9 và theo bảng chữ cái.
12. Better Fonts
– Các font chữ được bố trí ở khung bên trái của trang web, nếu bạn muốn xem trước một font nào đó trước khi tải về thì bạn chỉ cần nhấn chuột vào font đó và xem tại khung bên trái.
13. High Fonts
– Có khoảng 3218 font miễn phí và 25084 trả phí cho bạn sử lựa chọn đa dạng.
14. Free Premium Fonts
– Với rất nhiều font chat lượng cao được sắp xếp hợp lý theo bảng chữ cái và các danh mục thông dụng.
15. Font Squirrel
– Các font chữ được miễn phí sử dụng cả trong mục đích thương mại nên bạn có thể hoàn toàn yên tâm khi tải chúng.
16. Font Post
– Với hơn 11000 font miễn phí sẵn sàng cho bạn tải bất kỳ lúc nào để sử dụng.
17. Font Space
– Các font miễn phí (khoảng 11613 font) được chỉa sẻ bởi rất nhiều nhà thiết kế trên toàn thế giới.
18. Urban Fonts
– Đây là địa chỉ tốt nhất bạn có thể tải các loại font với số lượng trên 8000 font miễn phí.
Nguồn: ST

markdown:
Làm
**thiết kế đồ họa**, ngoài kỹ năng và kiến thức về đồ họa của bản thân thì designer còn cần phải biết cập nhật nhiều kiến thức và ý tưởng khác nhau về đô họa để phục vụ cho việc làm thiết kế của mình. Các website dưới đây cung cấp cho bạn kho kiến thức về đồ họa rất cần thiết và bổ ích.
2. Fontchu.com- Website fonts chữ số 1 Việt Nam
– Download hơn 2000 font tiếng Việt đẹp miễn phí.
– Đầy đủ các font chữ tiếng Việt: font VNI, font Unicode, font thư pháp, font ABC
– Tốc độ tải phông chữ nhanh, nhiều công cụ, phần mềm hỗ trợ font vn
– Font chữ đẹp để design, font nước ngoài: tiếng Trung, Nhật Hàn
Tất cả những cái trên là do website này “tự giới thiệu” tôi chỉ copy lại mà thôi…
3. 1kho.com – Cần là có, mò là thấy
Cái câu slogan của website này khá là “xì-teen” nhưng tin tôi đi trang web này có đủ mọi thứ trên đời (nói hơi quá nhưng khi bạn tìm một cái gì đó thì nên tạt qua trang này trước khi tìm ở các trang khác). Nhưng…để download được thì chúng ta phải tốn phí và không được dùng các chương trình hỗ trợ download như Internet Download Manager,…
4. Search Free Fonts
– Trang web gồm rất nhiều loại font như : nghệ thuật, 3D, hài hước….
5. Da Fonts
– Chứa các loại font như : cơ bản (Sans serif, serif…), valentine..
6. 1001 Free Fonts
– Đúng như tên của trang web, các loại font rất đa dạng như : 3D, động vật, máy tính…
7. Fontica
– Tất cả các font được sắp xếp theo bảng chữ cái từ A-Z
8. Abstract Fonts
– Với số lượng khổng lồ gần 13000 font, bạn sẽ tìm được loại font bạn cần một cách dễ dàng và hoàn toàn miễn phí.
9. Cream Undo
– Bạn có thể gõ đoạn chữ bạn muốn để xem trước loại font bạn cần bằng cách nhập vào ô trống rồi nhấn nút View text.
10. Font Cubes
– Các loại font cách điệu và phong cách
11. Font Stock
– Có cả các loại font miễn phí và trả phí được sắp xếp theo thứ tự từ 0-9 và theo bảng chữ cái.
12. Better Fonts
– Các font chữ được bố trí ở khung bên trái của trang web, nếu bạn muốn xem trước một font nào đó trước khi tải về thì bạn chỉ cần nhấn chuột vào font đó và xem tại khung bên trái.
13. High Fonts
– Có khoảng 3218 font miễn phí và 25084 trả phí cho bạn sử lựa chọn đa dạng.
14. Free Premium Fonts
– Với rất nhiều font chat lượng cao được sắp xếp hợp lý theo bảng chữ cái và các danh mục thông dụng.
15. Font Squirrel
– Các font chữ được miễn phí sử dụng cả trong mục đích thương mại nên bạn có thể hoàn toàn yên tâm khi tải chúng.
16. Font Post
– Với hơn 11000 font miễn phí sẵn sàng cho bạn tải bất kỳ lúc nào để sử dụng.
17. Font Space
– Các font miễn phí (khoảng 11613 font) được chỉa sẻ bởi rất nhiều nhà thiết kế trên toàn thế giới.
18. Urban Fonts
– Đây là địa chỉ tốt nhất bạn có thể tải các loại font với số lượng trên 8000 font miễn phí.
Nguồn: ST

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Identified-Payload-Type: application/xhtml+xml

Connection: close

Vary: Accept-Encoding,User-Agent

Link: <http://hocdohoa.org/wp-json/>; rel="https://api.w.org/", <http://wp.me/p9a4zK-Bn>; rel=shortlink

Content-Type: text/html; charset=UTF-8


text:
Mình vừa tốt nghiệp chuyên ngành kế toán của trường Công nghiệp. Nhưng mình thấy những kiến thức ở trường mình được học nghiêng về lý thuyết là chính, nên mình đang muốn học thêm một khoá học kế toán thực tế để nâng cao khả năng và kinh nghiệm, sẽ dễ dàng hơn khi tìm kiếm một công việc đúng chuyên ngành. Mặc dù vậy, mình cũng phân vân là không biết có nên lựa chọn trung tâm học kế toán thực tế để học không và không biết ở khu vực Hà Nội thì trung tâm nào dạy kế toán thức tế tốt nhất?
Liên hệ: 0982.556.857 - P208 Ngõ 28D Lương Định Của, Phương Mai, HN
HỎI ĐÁP NHANH - HỎI ĐÁP TRỰC TUYẾN CHO NGƯỜI VIỆT
Muốn biết thì phải hỏi - Muốn giỏi thì phải đáp
Liên hệ quản trị trang: dangnamkien@gmail.com - 89B Lý Nam Đế - Hoàn Kiếm - Hà Nội

WARC-Identified-Payload-Type: text/html

Server: Apache/2.4.33 (cPanel) OpenSSL/1.0.2o mod_bwlimited/1.4 Phusion_Passenger/5.1.12

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Pragma: no-cache

Set-Cookie: qa_key=jpd35m2mdn15kx3ow6o69qhuz35bcu8i; expires=Wed, 18-Jul-2018 04:45:51 GMT; path=/

Content-Type: text/html; charset=utf-8

Via: 1.1 varnish-v4

Accept-Ranges: bytes

Transfer-Encoding: chunked


text:
Hồ Chí Minh, nhà văn hóa kiệt xuất
Đăng ngày: 15/05/2018
(ĐHVH HN) - Trong hành trình tìm đường cứu nước, giải phóng dân tộc, Chủ tịch Hồ Chí Minh đã thông thạo nhiều ngôn ngữ tiêu biểu cho nền văn minh của nhân loại, đã tiếp xúc với văn hóa nhiều nước, nhiều vùng trên thế giới, cả ở phương Đông và phương Tây. Có thể nói ít có vị lãnh tụ nào lại am hiểu nhiều về văn hóa các dân tộc trên thế giới sâu sắc như Chủ tịch Hồ Chí Minh. Nhưng điều kì lạ là tất cả những ảnh hưởng quốc tế đó đã hòa quyện với cái gốc văn hóa truyền thống dân tộc không gì lay chuyển được ở Người, để tạo thành nhà văn hóa kiệt xuất Hồ Chí Minh, rất Việt Nam, rất phương Đông, nhưng đồng thời cũng rất mới, rất hiện đại.
Nhân kỷ niệm 128 năm ngày sinh của Chủ tịch Hồ Chí Minh (19/5/1890-19/5/2018), chúng ta ôn lại tư tưởng của Người đã để lại cho dân tộc, cho thời đại. Đặc biệt là tư tưởng về Văn hóa.
1. Sự kết hợp hài hòa giữa tinh hoa văn hóa dân tộc với tinh hoa văn hóa của nhân loại trong tư tưởng Hồ Chí Minh
Hồ Chí Minh sinh ra trong một gia đình nhà nho yêu nước, gần gũi với nhân dân tại xứ Nghệ, một vùng đất “địa linh, nhân kiệt”, mang đậm chất văn hoá truyền thống chung của dân tộc và những nét đặc trưng riêng của dải đất miền Trung. Chính mái ấm gia đình thanh cao và quê hương anh dũng ấy đã nuôi dưỡng trong tâm hồn Hồ Chí Minh lòng yêu thương con người, đức tính khiêm nhường, ôn hoà, trọng nghĩa, trọng tình, không ham phú quý, không màng danh lợi, ham học hỏi, ham hiểu biết… và đặc biệt là đạo đức “lấy mình làm gương”.
Mảnh đất Kim Liên cũng đã thấm máu anh hùng của bao liệt sĩ chống Pháp như Vương Thúc Mậu, Nguyễn Sinh Quyến....cả chị và anh của Người cũng đều tham gia hoạt động yêu nước, chống Pháp, bị bắt giam và lưu đày hàng chục năm. Không phải ngẫu nhiên mà Nghệ Tĩnh có vinh dự sinh ra vị anh hùng giải phóng dân tộc, nhà tư tưởng, nhà văn hóa kiệt xuất của nước Việt Nam mới.
Ngày5/ 6/1911, người thanh niên yêu nước Nguyễn Tất Thành rời bến cảng Nhà Rồng ra đi tìm đường cứu nước, giải phóng dân tộc. Người đã có quyết định sáng tạo đầu tiên là không “Đông du” theo con đường và lời mời của Phan Bội Châu mà “Tây du” theo sự mách bảo của trí tuệ, một tư duy khoa học kết hợp với khát vọng, hoài bão giải phóng đồng bào. Người làm việc như một công nhân thực sự; viết đơn xin học Trường Thuộc địa với ý định đã có từ lúc trạc 13 tuổi là “muốn làm quen với nền văn minh Pháp, muốn tìm xem những gì ẩn đằng sau những chữ ấy”([1]). Ý định này bộc lộ một tầm nhìn xa trông rộng, sáng tạo và bản lĩnh của Người trong việc khám phá, khai thác văn hóa, văn minh nhân loại, khoa học công nghệ của thế giới tư bản, của những nước xâm lược dân tộc mình, để phục vụ cho nhân dân mình.
Trên hành trình tìm con đường cứu nước, Hồ Chí Minh đã luôn tiếp thu, kế thừa kế thừa những giá trị tinh hoa của những nền văn hoá trên thế giới: sự tu dưỡng đạo đức cá nhân của Khổng giáo - tinh hoa văn hóa Trung Hoa; lòng nhân ái, vị tha của Phật giáo - tinh hoa văn hoá của Ấn Độ; lòng nhân từ và đức hy sinh… của Thiên Chúa giáo; tư tưởng tự do, bình đẳng, bác ái của cách mạng tư sản Pháp… Tuy nhiên, nói đến văn hóa nhân loại có tầm cỡ vĩ đại nhất và ảnh hưởng lớn nhất đối với Chủ tịch Hồ Chí Minh phải nói đến chủ nghĩa Mác-Lênin. Chính chủ nghĩa Mác-Lênin đã thức tỉnh và làm hoàn thiện chủ nghĩa yêu nước ở Hồ Chí Minh gắn với thời đại mới. Đối với Hồ Chí Minh, chủ nghĩa Mác-Lênin cũng giống như chiếc cẩm nang thần kỳ, “là mặt trời soi sáng con đường chúng ta đi tới thắng lợi cuối cùng, đi tới chủ nghĩa xã hội và chủ nghĩa cộng sản”([2]). Tìm được con đường cứu nước đúng đắn, con đường cách mạng vô sản, Người trở về nước vào ngày 28/1/ 1941 để lãnh đạo nhân dân Việt Nam làm cách mạng giải phóng dân tộc, đúng như ước nguyện khi Người ra đi. Tại Cao Bằng, Người đã thành lập Mặt trận đoàn kết dân tộc, tổ chức lực lượng vũ trang, vận động nhân dân đấu tranh giành độc lập vào năm 1945, lập nên nước Việt Nam Dân chủ Cộng hòa, xây dựng chế độ dân chủ nhân dân, giải phóng các tầng lớp nhân dân lao động khỏi ách áp bức bóc lột của thực dân, phong kiến trở thành người làm chủ nước nhà, từng bước đưa đất nước đi lên chủ nghĩa xã hội, xóa bỏ tận gốc bóc lột, bất công. Đó không phải chỉ là một sự nghiệp chính trị phi thường mà còn là một sự nghiệp văn hoá cao cả.
Phấn đấu cho một xã hội mà ở đó dân tộc được độc lập, dân quyền được tự do, dân sinh được hạnh phúc là tiêu chí xem xét một cuộc cách mạng, cũng là sự nghiệp cả cuộc đời Hồ Chí Minh mong đạt tới. Người khẳng định ham muốn tột bậc của Người “là làm sao cho nước ta được hoàn toàn độc lập, dân ta được hoàn toàn tự do, đồng bào ai cũng có cơm ăn áo mặc, ai cũng được học hành”([3]). Hơn thế, còn là sự ước muốn cho mọi người cần lao trên trái đất, không phân biệt màu da, sắc tộc, được sống đời tự do.
2. Nhà văn hóa Hồ Chí Minh đã sáng tạo ra một nền văn hoá mới trong lịch sử dân tộc Việt Nam, đóng góp vào sự phát triển văn hoá của thế giới.
Khi cả đất nước và dân tộc còn bị nô lệ thì văn hóa cũng cùng chung số phận nô lệ, tuyệt đại bộ phận nhân dân bị đày đọa trong vòng tăm tối, dốt nát. Vì vậy có những nhà yêu nước chủ trương trước hết phải khai dân trí, phải nâng cao trình độ văn hóa của nhân dân sau đó mới tính đến chuyện giành độc lập tự do cho đất nước và dân tộc. Lãnh đạo nhân dân đi theo con đường cách mạng vô sản, Hồ Chí Minh đã vạch ra một đường lối mới: Phải tiến hành cách mạng chính trị trước mà cụ thể ở Việt Nam là tiến hành cách mạng giải phóng dân tộc để giành chính quyền, để giải phóng chính trị, giải phóng xã hội, từ đó giải phóng văn hóa. Quan điểm của Người là văn hóa không thể tách rời với quốc gia dân tộc, văn hóa mang tâm hồn, diện mạo dân tộc. Người chỉ rõ những mục tiêu cơ bản mà cách mạng Việt Nam cần phải đạt được trong lĩnh vực văn hoá là: “Phải triệt để tẩy trừ mọi di tích thuộc địa và ảnh hưởng nô dịch của văn hoá đế quốc. Đồng thời phát triển những truyền thống tốt đẹp của văn hoá dân tộc và hấp thụ những cái mới của văn hoá tiến bộ thế giới, để xây dựng một nền văn hoá Việt Nam có tính dân tộc, khoa học và đại chúng”([4]). Ngày 28/8/1945, Chủ tịch Hồ Chí Minh ký sắc lệnh thành lập Bộ Thông tin tuyên truyền([5]), thành viên của nước Việt Nam dân chủ cộng hoà. Với quan điểm “Một dân tộc dốt là một dân tộc yếu”, Người chủ trương một trong những công việc phải thực hiện cấp tốc sau ngày nước nhà giành được độc lập là phát triển văn hóa, xoá mù chữ, nâng cao dân trí, phát triển giáo dục. Ngày 8/9/1945, Chủ tịch Hồ Chí Minh ký 3 sắc lệnh quan trọng về giáo dục là sắc lệnh về việc thành lập Nha Bình dân học vụ, sắc lệnh quy định mọi làng phải có lớp học bình dân và sắc lệnh cưỡng bức học chữ quốc ngữ không mất tiền. Thực hiện lời kêu gọi của Chủ tịch Hồ Chí Minh: “Những người đã biết chữ hãy dạy cho những người chưa biết chữ”... Vợ chưa biết thì chồng bảo, em chưa biết thì anh bảo, cha mẹ không biết thì con bảo, người ăn người làm không biết thì chủ nhà bảo”([6]), một phong trào diệt giặc dốt đã dâng cao trong cả nước. Nhờ đó, chỉ một năm sau Cách mạng tháng Tám, đã có 2,5 triệu người dân biết đọc, biết viết. Công tác văn hoá, giáo dục, y tế cũng được chính quyền mới quan tâm đẩy mạnh. Ngày 10/10/1945, Chủ tịch Hồ Chí Minh ký Sắc lệnh số 45 thành lập một ban Đại học Văn khoa tại Hà Nội nhằm đào tạo giáo viên văn học Việt Nam cho xứng đáng một nước độc lập và theo kịp các nước tiên tiến trên thế giới. Tính ưu việt của chế độ xã hội mới đã được khẳng định và phát huy.
Hướng con người tới tầm cao văn hóa của một đất nước độc lập và tiến lên theo con đường xã hội chủ nghĩa, tháng 3/1947, Chủ tịch Hồ Chí Minh đã viết tác phẩm Đời sống mới với ba nội dung: xây dựng đạo đức mới, xây dựng lối sống mới và xây dựng nếp sống mới. Với tinh thần và quyết tâm “mỗi người đều tốt, thì thành làng tốt, nước mạnh... mọi người đều cố gắng làm đúng đời sống mới, thì dân tộc nhất định sẽ phú cường”([7]), cuộc vận động đã trở thành một phong trào quần chúng sôi nổi, rộng khắp ngay cả khi kẻ thù có dã tâm cướp nước ta một lần nữa, toàn thể dân tộc phải bước vào cuộc kháng chiến chống Pháp lâu dài và gian khổ, cuộc sống thời chiến muôn vàn khó khăn thiếu thốn.
Chủ tịch Hồ Chí Minh xác định càng thấm nhuần chủ nghĩa Mác - Lênin, càng phải coi trọng truyền thống tốt đẹp của cha ông. Nhưng giữ gìn, phát huy truyền thống, bản sắc văn hoá dân tộc, không có nghĩa là tự bó mình trong chủ nghĩa dân tộc hẹp hòi, thiển cận mà phải ra sức nghiên cứu học tập tinh hoa văn hoá của thế giới. Chính Người, với bản lĩnh của nhà văn hóa, nhà ngoại giao kiệt xuất, bằng sự nghiệp hoạt động cách mạng, hoạt động văn hóa của mình, đã là người Việt Nam đầu tiên bắc nhịp cầu hữu nghị giữa nhân dân Việt Nam với các dân tộc trên thế giới. Năm 1958, theo lời mời cuả Thủ tướng Ấn Độ, Chủ tịch Hồ Chí Minh sang thăm Ấn Độ. Trong bữa tiệc do Thủ tướng Nêru chiêu đãi Bác có món thịt gà địa phương rất nổi tiếng. Phong tục của người Ấn Độ khi ăn cơm không dùng thìa, dĩa mà dùng 5 ngón tay để bốc thức ăn. Cả Bộ trưởng Ngoại giao Ấn Độ cũng muốn dùng tay bốc thức ăn. Nhưng tại bữa tiệc quốc tế người ta phải dùng dao, thìa, dĩa cho lịch sự. Khi món thịt gà được đưa ra, các quan khách Ấn Độ có vẻ không quen dùng dao, dĩa. Bác rất tinh ý và nói với Thủ tướng Neru rằng: “Thịt gà phải ăn bằng tay thì mới ngon, chứ còn ăn bằng thìa dĩa thì khác nào nói chuyện với người yêu lại phải qua ông phiên dịch”. Nghe Bác Hồ nói vậy, cả bàn tiệc cười vang làm cho không khí bữa tiệc hôm đó rất vui vẻ và thân mật. (Câu chuyện thú vị này, tôi đã được nghe qua lời thuyết minh của cô thuyết minh viên tại Bảo tàng Mâhátma Gandi trong chuyến du học 3 tháng của tôi tại Ấn Độ).
3. Không những là nhà cách mạng mà còn là nhà văn hóa lớn, Hồ Chí Minh đã để lại một sự nghiệp văn hóa vô cùng trong sáng và đẹp đẽ.
Là chiến sĩ tiên phong của nền văn học - nghệ thuật, báo chí cách mạng, đấu tranh cho độc lập dân tộc và chủ nghĩa xã hội, cho công bằng, tình thương và lẽ phải trên trái đất, sự đóng góp của Chủ tịch Hồ Chí Minh về văn hóa rất phong phú và đa dạng, thấm đượm trong toàn bộ cuộc đời và sự nghiệp của Người. Chủ tịch Hồ Chí Minh là tác giả của hơn 250 bài thơ, khoảng 2.000 bài báo, nhiều truyện ngắn, văn chính luận, tiểu phẩm văn học, nhưng Người khước từ mọi danh hiệu văn hóa - văn nghệ mà chỉ nhận là nhà cách mạng chuyên nghiệp. Bởi động lực làm cho ngòi bút của Người ngày càng sắc bén và linh hoạt chính là sự giác ngộ từ chủ nghĩa yêu nước đến chủ nghĩa quốc tế vô sản. Trên con đường vạn dặm tìm đường cứu nước, giải phóng dân tộc kéo dài 30 năm, ở một góc nhỏ của thủ đô Pari nước Pháp, Người đã học làm báo và dùng những bài báo bằng tiếng Pháp đầu tiên của mình để tố cáo tội ác của chế độ thực dân (Người cùng khổ). Chính việc làm báo và viết báo đã định hướng cho Người sự hiểu biết từng bước, dần dần sâu sắc hơn về quan điểm và lập trường chính trị.
Hồ Chí Minh đã là người sáng lập ra nhiều tờ báo cách mạng đầu tiên ở Việt Nam, là người đặt nền móng cho nền giáo dục văn học, thơ ca cách mạng của nước ta. Với đất nước, các tác phẩm báo chí, văn học nghệ thuật của Người đã trở thành di sản thiêng liêng, minh chứng cho cuộc đời hoạt động phong phú, sôi nổi cũng như tài năng của vị lãnh tụ thiên tài của dân tộc. Với những thế hệ nhà báo, nhà văn Việt Nam, các tác phẩm của Người là một cẩm nang quý báu cho những ai muốn tìm hiểu về lịch sử báo chí cách mạng Việt Nam, về phong cách làm báo Hồ Chí Minh - giản dị và sâu sắc, chân thực và ngắn gọn, trong sáng và dễ hiểu mà hiệu quả sắc bén, phục vụ đắc lực cho nhu cầu của nhân dân, cho sự nghiệp cách mạng của Tổ quốc. Những người làm công tác văn hóa, văn học nghệ thuật còn luôn nhớ tới sự quan tâm toàn diện, sát sao của Bác dành cho sự nghiệp xây dựng và phát triển nền văn hóa, nghệ thuật của dân tộc: Từ vị trí, vai trò, chức năng, nhiệm vụ của ngành văn hoá trong sự nghiệp cách mạng đến nguồn gốc, đối tượng phục vụ, phạm vi phản ánh của văn hoá nghệ thuật; mối quan hệ giữa nghệ sĩ, tác phẩm và công chúng; sự thống nhất giữa nội dung và hình thức của tác phẩm; mối quan hệ giữa tính truyền thống và hiện đại, tính dân tộc và quốc tế, chính trị và văn học, tư tưởng và nghệ thuật; từ mối quan hệ giữa bảo tồn và phát triển, phổ cập và nâng cao đến làm thế nào cho tác phẩm có tính hấp dẫn, có sức cuốn hút thông qua cách viết, cách thể hiện... ; nghĩa vụ và trách nhiệm của những chiến sĩ trên mặt trận văn hoá văn nghệ…
Chủ tịch Hồ Chí Minh đã tiếp thu tinh hoa văn hóa nhân loại một cách có chọn lọc rồi vận dụng tinh hoa đó một cách sát hợp vào những điều kiện cụ thể của đất nước, của dân tộc vì mục đích không chỉ cho sự nghiệp giải phóng dân tộc mình mà còn góp phần tích cực nhất vào sự nghiệp của các dân tộc khác trên thế giới. Nhờ cách tiếp thu sáng tạo những di sản này để mưu cầu hạnh phúc cho dân tộc và loài người và với nhiều cống hiến khác trong giáo dục nghệ thuật, giao lưu quốc tế và giữ gìn bản sắc dân tộc, Chủ tịch Hồ Chí Minh đã được tổ chức UNESCO tôn vinh là một anh hùng giải phóng dân tộc, nhà văn hoá kiệt xuất của nhân loại./.
--
Tác giả: TS. Trần Thị Mai Thanh (Trường ĐHVH HN)
[1] Hồ Chí Minh: Toàn tập, Nxb Chính trị quốc gia, H.2000, t.1, tr.477
[2] Hồ Chí Minh toàn tập, Sđd, t.10, tr.128
[3] Hồ Chí Minh: Toàn tập, Sđd, t.4, tr.161
[4] Hồ Chí Minh: Toàn tập, Sđd, t.6, tr.173
[5] Tiền thân của Bộ Văn hoá - Thông tin và nay là Bộ Văn hoá, Thể thao và Du lịch
[6] Hồ Chí Minh: Toàn tập, Sđd, t.4, tr.37
[7] Hồ Chí Minh: Toàn tập, Sđd, t.5, tr.99
Lượt xem: 2153
Xem nhiều
Các tin trước
- Dạy kỹ năng Nghe cho sinh viên không chuyên qua các bài hát tiếng Anh13.05.2018
- Sách Việt Nam trong tiến trình hội nhập thế giới09.05.2018
- Một số cặp từ dễ bị nhầm lẫn trong Tiếng Anh27.04.2018
- Bảo tồn và phát huy giá trị văn hóa lễ hội Đền Cờn21.04.2018
- Ẩm thực chay trong văn hóa ẩm thực Việt04.04.2018
- Thư mời đăng ký Thuyết trình khoa học23.03.2018
- “Bá quyền văn hóa”nhìn từ hiện tượng thơ bang giao Việt – Trung trong bối cảnh Đông Á trung đại27.11.2017
- Một số trao đổi khi nghiên cứu về văn hóa tộc người thiểu số08.11.2017
- Một số chú ý khi sử dụng lệnh tìm kiếm trong Windows 722.09.2017
- Nơi cưu mang những mảnh vỡ quá khứ17.08.2017
Các tin tiếp theo
- Hai “nữ tư lệnh” của làng báo đầu thế kỷ XX21.06.2018
- Học từ vựng tiếng Anh20.06.2018
- Viết thư xin việc bằng tiếng Anh15.06.2018
- Tăng cường sự tự tin giúp nâng cao kỹ năng nói cho sinh viên14.06.2018
- Sử dụng giáo trình New English File sơ cấp trong dạy kỹ năng Nói cho sinh viên không chuyên năm thứ nhất tại ĐHVH HN12.06.2018
- Các biện pháp nâng cao kỹ năng nghe tiếng Anh cho sinh viên không chuyên08.06.2018
- Các chiến lược nâng cao kỹ năng viết tiếng Anh cho sinh viên không chuyên31.05.2018
- Đôi điều cần biết khi viết sơ yếu lí lịch bằng tiếng Anh28.05.2018
- Làm thế nào để học tiếng Anh có hiệu quả?23.05.2018
- Sử dụng hoạt động nhóm nhằm khuyến khích sinh viên không chuyên học kỹ năng Nói22.05.2018

markdown:
# Hồ Chí Minh, nhà văn hóa kiệt xuất
Đăng ngày: 15/05/2018
**(ĐHVH HN) -** *Trong hành trình tìm đường cứu nước, giải phóng dân tộc, Chủ tịch Hồ Chí Minh đã thông thạo nhiều ngôn ngữ tiêu biểu cho nền văn minh của nhân loại, đã tiếp xúc với văn hóa nhiều nước, nhiều vùng trên thế giới, cả ở phương Đông và phương Tây. Có thể nói ít có vị lãnh tụ nào lại am hiểu nhiều về văn hóa các dân tộc trên thế giới sâu sắc như Chủ tịch Hồ Chí Minh. Nhưng điều kì lạ là tất cả những ảnh hưởng quốc tế đó đã hòa quyện với cái gốc văn hóa truyền thống dân tộc không gì lay chuyển được ở Người, để tạo thành nhà văn hóa kiệt xuất Hồ Chí Minh, rất Việt Nam, rất phương Đông, nhưng đồng thời cũng rất mới, rất hiện đại.* *Nhân kỷ niệm 128 năm ngày sinh của Chủ tịch Hồ Chí Minh (19/5/1890-19/5/2018), chúng ta ôn lại tư tưởng của Người đã để lại cho dân tộc, cho thời đại. Đặc biệt là tư tưởng về Văn hóa.* **1. Sự kết hợp hài hòa giữa tinh hoa văn hóa dân tộc với tinh hoa văn hóa của nhân loại trong tư tưởng Hồ Chí Minh**
Hồ Chí Minh sinh ra trong một gia đình nhà nho yêu nước, gần gũi với nhân dân tại xứ Nghệ, một vùng đất “địa linh, nhân kiệt”, mang đậm chất văn hoá truyền thống chung của dân tộc và những nét đặc trưng riêng của dải đất miền Trung. Chính mái ấm gia đình thanh cao và quê hương anh dũng ấy đã nuôi dưỡng trong tâm hồn Hồ Chí Minh lòng yêu thương con người, đức tính khiêm nhường, ôn hoà, trọng nghĩa, trọng tình, không ham phú quý, không màng danh lợi, ham học hỏi, ham hiểu biết… và đặc biệt là đạo đức “lấy mình làm gương”.
Mảnh đất Kim Liên cũng đã thấm máu anh hùng của bao liệt sĩ chống Pháp như Vương Thúc Mậu, Nguyễn Sinh Quyến....cả chị và anh của Người cũng đều tham gia hoạt động yêu nước, chống Pháp, bị bắt giam và lưu đày hàng chục năm. Không phải ngẫu nhiên mà Nghệ Tĩnh có vinh dự sinh ra vị anh hùng giải phóng dân tộc, nhà tư tưởng, nhà văn hóa kiệt xuất của nước Việt Nam mới.
Ngày5/ 6/1911, người thanh niên yêu nước Nguyễn Tất Thành rời bến cảng Nhà Rồng ra đi tìm đường cứu nước, giải phóng dân tộc. Người đã có quyết định sáng tạo đầu tiên là không “Đông du” theo con đường và lời mời của Phan Bội Châu mà “Tây du” theo sự mách bảo của trí tuệ, một tư duy khoa học kết hợp với khát vọng, hoài bão giải phóng đồng bào. Người làm việc như một công nhân thực sự; viết đơn xin học Trường Thuộc địa với ý định đã có từ lúc trạc 13 tuổi là “
*muốn làm quen với nền văn minh Pháp, muốn tìm xem những gì ẩn đằng sau những chữ ấy*”( [[1]](http://huc.edu.vn/#_edn1)). Ý định này bộc lộ một tầm nhìn xa trông rộng, sáng tạo và bản lĩnh của Người trong việc khám phá, khai thác văn hóa, văn minh nhân loại, khoa học công nghệ của thế giới tư bản, của những nước xâm lược dân tộc mình, để phục vụ cho nhân dân mình.
Trên hành trình tìm con đường cứu nước, Hồ Chí Minh đã luôn tiếp thu, kế thừa kế thừa những giá trị tinh hoa của những nền văn hoá trên thế giới: sự tu dưỡng đạo đức cá nhân của Khổng giáo - tinh hoa văn hóa Trung Hoa; lòng nhân ái, vị tha của Phật giáo - tinh hoa văn hoá của Ấn Độ; lòng nhân từ và đức hy sinh… của Thiên Chúa giáo; tư tưởng tự do, bình đẳng, bác ái của cách mạng tư sản Pháp… Tuy nhiên, nói đến văn hóa nhân loại có tầm cỡ vĩ đại nhất và ảnh hưởng lớn nhất đối với Chủ tịch Hồ Chí Minh phải nói đến chủ nghĩa Mác-Lênin. Chính chủ nghĩa Mác-Lênin đã thức tỉnh và làm hoàn thiện chủ nghĩa yêu nước ở Hồ Chí Minh gắn với thời đại mới. Đối với Hồ Chí Minh, chủ nghĩa Mác-Lênin cũng giống như chiếc cẩm nang thần kỳ, “
*là mặt trời soi sáng con đường chúng ta đi tới thắng lợi cuối cùng, đi tới chủ nghĩa xã hội và chủ nghĩa cộng sản*”( [[2]](http://huc.edu.vn/#_edn2)). Tìm được con đường cứu nước đúng đắn, con đường cách mạng vô sản, Người trở về nước vào ngày 28/1/ 1941 để lãnh đạo nhân dân Việt Nam làm cách mạng giải phóng dân tộc, đúng như ước nguyện khi Người ra đi. Tại Cao Bằng, Người đã thành lập Mặt trận đoàn kết dân tộc, tổ chức lực lượng vũ trang, vận động nhân dân đấu tranh giành độc lập vào năm 1945, lập nên nước Việt Nam Dân chủ Cộng hòa, xây dựng chế độ dân chủ nhân dân, giải phóng các tầng lớp nhân dân lao động khỏi ách áp bức bóc lột của thực dân, phong kiến trở thành người làm chủ nước nhà, từng bước đưa đất nước đi lên chủ nghĩa xã hội, xóa bỏ tận gốc bóc lột, bất công. Đó không phải chỉ là một sự nghiệp chính trị phi thường mà còn là một sự nghiệp văn hoá cao cả.
Phấn đấu cho một xã hội mà ở đó dân tộc được độc lập, dân quyền được tự do, dân sinh được hạnh phúc là tiêu chí xem xét một cuộc cách mạng, cũng là sự nghiệp cả cuộc đời Hồ Chí Minh mong đạt tới. Người khẳng định ham muốn tột bậc của Người
*“là làm sao cho nước ta được hoàn toàn độc lập, dân ta được hoàn toàn tự do, đồng bào ai cũng có cơm ăn áo mặc, ai cũng được học hành*”( [[3]](http://huc.edu.vn/#_edn3)). Hơn thế, còn là sự ước muốn cho mọi người cần lao trên trái đất, không phân biệt màu da, sắc tộc, được sống đời tự do. **2. Nhà văn hóa Hồ Chí Minh đã sáng tạo ra một nền văn hoá mới trong lịch sử dân tộc Việt Nam, đóng góp vào sự phát triển văn hoá của thế giới.**
Khi cả đất nước và dân tộc còn bị nô lệ thì văn hóa cũng cùng chung số phận nô lệ, tuyệt đại bộ phận nhân dân bị đày đọa trong vòng tăm tối, dốt nát. Vì vậy có những nhà yêu nước chủ trương trước hết phải khai dân trí, phải nâng cao trình độ văn hóa của nhân dân sau đó mới tính đến chuyện giành độc lập tự do cho đất nước và dân tộc. Lãnh đạo nhân dân đi theo con đường cách mạng vô sản, Hồ Chí Minh đã vạch ra một đường lối mới: Phải tiến hành cách mạng chính trị trước mà cụ thể ở Việt Nam là tiến hành cách mạng giải phóng dân tộc để giành chính quyền, để giải phóng chính trị, giải phóng xã hội, từ đó giải phóng văn hóa. Quan điểm của Người là văn hóa không thể tách rời với quốc gia dân tộc, văn hóa mang tâm hồn, diện mạo dân tộc. Người chỉ rõ những mục tiêu cơ bản mà cách mạng Việt Nam cần phải đạt được trong lĩnh vực văn hoá là: “
*Phải triệt để tẩy trừ mọi di tích thuộc địa và ảnh hưởng nô dịch của văn hoá đế quốc. Đồng thời phát triển những truyền thống tốt đẹp của văn hoá dân tộc và hấp thụ những cái mới của văn hoá tiến bộ thế giới, để xây dựng một nền văn hoá Việt Nam có tính dân tộc, khoa học và đại chúng*”( [[4]](http://huc.edu.vn/#_edn4)). Ngày 28/8/1945, Chủ tịch Hồ Chí Minh ký sắc lệnh thành lập Bộ Thông tin tuyên truyền( [[5]](http://huc.edu.vn/#_edn5)), thành viên của nước Việt Nam dân chủ cộng hoà. Với quan điểm “Một dân tộc dốt là một dân tộc yếu”, Người chủ trương một trong những công việc phải thực hiện cấp tốc sau ngày nước nhà giành được độc lập là phát triển văn hóa, xoá mù chữ, nâng cao dân trí, phát triển giáo dục. Ngày 8/9/1945, Chủ tịch Hồ Chí Minh ký 3 sắc lệnh quan trọng về giáo dục là sắc lệnh về việc thành lập Nha Bình dân học vụ, sắc lệnh quy định mọi làng phải có lớp học bình dân và sắc lệnh cưỡng bức học chữ quốc ngữ không mất tiền. Thực hiện lời kêu gọi của Chủ tịch Hồ Chí Minh: “ *Những người đã biết chữ hãy dạy cho những người chưa biết chữ*”... *Vợ chưa biết thì chồng bảo, em chưa biết thì anh bảo, cha mẹ không biết thì con bảo, người ăn người làm không biết thì chủ nhà bảo*”( [[6]](http://huc.edu.vn/#_edn6)), một phong trào diệt giặc dốt đã dâng cao trong cả nước. Nhờ đó, chỉ một năm sau Cách mạng tháng Tám, đã có 2,5 triệu người dân biết đọc, biết viết. Công tác văn hoá, giáo dục, y tế cũng được chính quyền mới quan tâm đẩy mạnh. Ngày 10/10/1945, Chủ tịch Hồ Chí Minh ký Sắc lệnh số 45 thành lập một ban Đại học Văn khoa tại Hà Nội nhằm đào tạo giáo viên văn học Việt Nam cho xứng đáng một nước độc lập và theo kịp các nước tiên tiến trên thế giới. Tính ưu việt của chế độ xã hội mới đã được khẳng định và phát huy.
Hướng con người tới tầm cao văn hóa của một đất nước độc lập và tiến lên theo con đường xã hội chủ nghĩa, tháng 3/1947, Chủ tịch Hồ Chí Minh đã viết tác phẩm
*Đời sống mới*với ba nội dung: xây dựng đạo đức mới, xây dựng lối sống mới và xây dựng nếp sống mới. Với tinh thần và quyết tâm “ *mỗi người đều tốt, thì thành làng tốt, nước mạnh... mọi người đều cố gắng làm đúng đời sống mới, thì dân tộc nhất định sẽ phú cường*”( [[7]](http://huc.edu.vn/#_edn7)), cuộc vận động đã trở thành một phong trào quần chúng sôi nổi, rộng khắp ngay cả khi kẻ thù có dã tâm cướp nước ta một lần nữa, toàn thể dân tộc phải bước vào cuộc kháng chiến chống Pháp lâu dài và gian khổ, cuộc sống thời chiến muôn vàn khó khăn thiếu thốn.
Chủ tịch Hồ Chí Minh xác định càng thấm nhuần chủ nghĩa Mác - Lênin, càng phải coi trọng truyền thống tốt đẹp của cha ông. Nhưng giữ gìn, phát huy truyền thống, bản sắc văn hoá dân tộc, không có nghĩa là tự bó mình trong chủ nghĩa dân tộc hẹp hòi, thiển cận mà phải ra sức nghiên cứu học tập tinh hoa văn hoá của thế giới. Chính Người, với bản lĩnh của nhà văn hóa, nhà ngoại giao kiệt xuất, bằng sự nghiệp hoạt động cách mạng, hoạt động văn hóa của mình, đã là người Việt Nam đầu tiên bắc nhịp cầu hữu nghị giữa nhân dân Việt Nam với các dân tộc trên thế giới. Năm 1958, theo lời mời cuả Thủ tướng Ấn Độ, Chủ tịch Hồ Chí Minh sang thăm Ấn Độ. Trong bữa tiệc do Thủ tướng Nêru chiêu đãi Bác có món thịt gà địa phương rất nổi tiếng. Phong tục của người Ấn Độ khi ăn cơm không dùng thìa, dĩa mà dùng 5 ngón tay để bốc thức ăn. Cả Bộ trưởng Ngoại giao Ấn Độ cũng muốn dùng tay bốc thức ăn. Nhưng tại bữa tiệc quốc tế người ta phải dùng dao, thìa, dĩa cho lịch sự. Khi món thịt gà được đưa ra, các quan khách Ấn Độ có vẻ không quen dùng dao, dĩa. Bác rất tinh ý và nói với Thủ tướng Neru rằng: “Thịt gà phải ăn bằng tay thì mới ngon, chứ còn ăn bằng thìa dĩa thì khác nào nói chuyện với người yêu lại phải qua ông phiên dịch”. Nghe Bác Hồ nói vậy, cả bàn tiệc cười vang làm cho không khí bữa tiệc hôm đó rất vui vẻ và thân mật. (Câu chuyện thú vị này, tôi đã được nghe qua lời thuyết minh của cô thuyết minh viên tại Bảo tàng Mâhátma Gandi trong chuyến du học 3 tháng của tôi tại Ấn Độ).
**3. Không những là nhà cách mạng mà còn là nhà văn hóa lớn, Hồ Chí Minh đã để lại một sự nghiệp văn hóa vô cùng trong sáng và đẹp đẽ.**
Là chiến sĩ tiên phong của nền văn học - nghệ thuật, báo chí cách mạng, đấu tranh cho độc lập dân tộc và chủ nghĩa xã hội, cho công bằng, tình thương và lẽ phải trên trái đất, sự đóng góp của Chủ tịch Hồ Chí Minh về văn hóa rất phong phú và đa dạng, thấm đượm trong toàn bộ cuộc đời và sự nghiệp của Người. Chủ tịch Hồ Chí Minh là tác giả của hơn 250 bài thơ, khoảng 2.000 bài báo, nhiều truyện ngắn, văn chính luận, tiểu phẩm văn học, nhưng Người khước từ mọi danh hiệu văn hóa - văn nghệ mà chỉ nhận là nhà cách mạng chuyên nghiệp. Bởi động lực làm cho ngòi bút của Người ngày càng sắc bén và linh hoạt chính là sự giác ngộ từ chủ nghĩa yêu nước đến chủ nghĩa quốc tế vô sản. Trên con đường vạn dặm tìm đường cứu nước, giải phóng dân tộc kéo dài 30 năm, ở một góc nhỏ của thủ đô Pari nước Pháp, Người đã học làm báo và dùng những bài báo bằng tiếng Pháp đầu tiên của mình để tố cáo tội ác của chế độ thực dân (
*Người cùng khổ*). Chính việc làm báo và viết báo đã định hướng cho Người sự hiểu biết từng bước, dần dần sâu sắc hơn về quan điểm và lập trường chính trị.
Hồ Chí Minh đã là người sáng lập ra nhiều tờ báo cách mạng đầu tiên ở Việt Nam, là người đặt nền móng cho nền giáo dục văn học, thơ ca cách mạng của nước ta. Với đất nước, các tác phẩm báo chí, văn học nghệ thuật của Người đã trở thành di sản thiêng liêng, minh chứng cho cuộc đời hoạt động phong phú, sôi nổi cũng như tài năng của vị lãnh tụ thiên tài của dân tộc. Với những thế hệ nhà báo, nhà văn Việt Nam, các tác phẩm của Người là một cẩm nang quý báu cho những ai muốn tìm hiểu về lịch sử báo chí cách mạng Việt Nam, về phong cách làm báo Hồ Chí Minh - giản dị và sâu sắc, chân thực và ngắn gọn, trong sáng và dễ hiểu mà hiệu quả sắc bén, phục vụ đắc lực cho nhu cầu của nhân dân, cho sự nghiệp cách mạng của Tổ quốc. Những người làm công tác văn hóa, văn học nghệ thuật còn luôn nhớ tới sự quan tâm toàn diện, sát sao của Bác dành cho sự nghiệp xây dựng và phát triển nền văn hóa, nghệ thuật của dân tộc: Từ vị trí, vai trò, chức năng, nhiệm vụ của ngành văn hoá trong sự nghiệp cách mạng đến nguồn gốc, đối tượng phục vụ, phạm vi phản ánh của văn hoá nghệ thuật; mối quan hệ giữa nghệ sĩ, tác phẩm và công chúng; sự thống nhất giữa nội dung và hình thức của tác phẩm; mối quan hệ giữa tính truyền thống và hiện đại, tính dân tộc và quốc tế, chính trị và văn học, tư tưởng và nghệ thuật; từ mối quan hệ giữa bảo tồn và phát triển, phổ cập và nâng cao đến làm thế nào cho tác phẩm có tính hấp dẫn, có sức cuốn hút thông qua cách viết, cách thể hiện... ; nghĩa vụ và trách nhiệm của những chiến sĩ trên mặt trận văn hoá văn nghệ…
Chủ tịch Hồ Chí Minh đã tiếp thu tinh hoa văn hóa nhân loại một cách có chọn lọc rồi vận dụng tinh hoa đó một cách sát hợp vào những điều kiện cụ thể của đất nước, của dân tộc vì mục đích không chỉ cho sự nghiệp giải phóng dân tộc mình mà còn góp phần tích cực nhất vào sự nghiệp của các dân tộc khác trên thế giới. Nhờ cách tiếp thu sáng tạo những di sản này để mưu cầu hạnh phúc cho dân tộc và loài người và với nhiều cống hiến khác trong giáo dục nghệ thuật, giao lưu quốc tế và giữ gìn bản sắc dân tộc, Chủ tịch Hồ Chí Minh đã được tổ chức UNESCO tôn vinh là một anh hùng giải phóng dân tộc, nhà văn hoá kiệt xuất của nhân loại./.
--
Tác giả:
**TS. Trần Thị Mai Thanh**(Trường ĐHVH HN) [[1]](http://huc.edu.vn/#_ednref1)Hồ Chí Minh: *T* *oàn tập*, Nxb Chính trị quốc gia, H.2000, t.1, tr.477 [[2]](http://huc.edu.vn/#_ednref2) *Hồ Chí Minh toàn tập*, Sđd, t.10, tr.128 [[3]](http://huc.edu.vn/#_ednref3)Hồ Chí Minh: *Toàn tập*, Sđd, t.4, tr.161 [[4]](http://huc.edu.vn/#_ednref4) *Hồ Chí Minh:* *Toàn tập* *,*Sđd *, t.6, tr.173* [[5]](http://huc.edu.vn/#_ednref5)Tiền thân của Bộ Văn hoá - Thông tin và nay là Bộ Văn hoá, Thể thao và Du lịch [[6]](http://huc.edu.vn/#_ednref6)Hồ Chí Minh: *Toàn tập*, Sđd, t.4, tr.37 [[7]](http://huc.edu.vn/#_ednref7)Hồ Chí Minh: *Toàn tập*, Sđd, t.5, tr.99
Lượt xem:
**2153**
Xem nhiều
Các tin trước
[Dạy kỹ năng Nghe cho sinh viên không chuyên qua các bài hát tiếng Anh](/day-ky-nang-nghe-cho-sinh-vien-khong-chuyen-qua-cac-bai-hat-tieng-anh-5366-vi.htm)13.05.2018 [Sách Việt Nam trong tiến trình hội nhập thế giới](/sach-viet-nam-trong-tien-trinh-hoi-nhap-the-gioi-5364-vi.htm)09.05.2018 [Một số cặp từ dễ bị nhầm lẫn trong Tiếng Anh](/mot-so-cap-tu-de-bi-nham-lan-trong-tieng-anh-5353-vi.htm)27.04.2018 [Bảo tồn và phát huy giá trị văn hóa lễ hội Đền Cờn](/bao-ton-va-phat-huy-gia-tri-van-hoa-le-hoi-den-con-5344-vi.htm)21.04.2018 [Ẩm thực chay trong văn hóa ẩm thực Việt](/am-thuc-chay-trong-van-hoa-am-thuc-viet-5319-vi.htm)04.04.2018 [Thư mời đăng ký Thuyết trình khoa học](/thu-moi-dang-ky-thuyet-trinh-khoa-hoc-5306-vi.htm)23.03.2018 [“Bá quyền văn hóa”nhìn từ hiện tượng thơ bang giao Việt – Trung trong bối cảnh Đông Á trung đại](/ba-quyen-van-hoanhin-tu-hien-tuong-tho-bang-giao-viet-trung-trong-boi-canh-dong-a-trung-dai-5202-vi.htm)27.11.2017 [Một số trao đổi khi nghiên cứu về văn hóa tộc người thiểu số](/mot-so-trao-doi-khi-nghien-cuu-ve-van-hoa-toc-nguoi-thieu-so-5182-vi.htm)08.11.2017 [Một số chú ý khi sử dụng lệnh tìm kiếm trong Windows 7](/mot-so-chu-y-khi-su-dung-lenh-tim-kiem-trong-windows-7-5117-vi.htm)22.09.2017 [Nơi cưu mang những mảnh vỡ quá khứ](/noi-cuu-mang-nhung-manh-vo-qua-khu-5069-vi.htm)17.08.2017
Các tin tiếp theo
[Hai “nữ tư lệnh” của làng báo đầu thế kỷ XX](/hai-nu-tu-lenh-cua-lang-bao-dau-the-ky-xx-5426-vi.htm)21.06.2018 [Học từ vựng tiếng Anh](/hoc-tu-vung-tieng-anh-5422-vi.htm)20.06.2018 [Viết thư xin việc bằng tiếng Anh](/viet-thu-xin-viec-bang-tieng-anh-5412-vi.htm)15.06.2018 [Tăng cường sự tự tin giúp nâng cao kỹ năng nói cho sinh viên](/tang-cuong-su-tu-tin-giup-nang-cao-ky-nang-noi-cho-sinh-vien-5409-vi.htm)14.06.2018 [Sử dụng giáo trình New English File sơ cấp trong dạy kỹ năng Nói cho sinh viên không chuyên năm thứ nhất tại ĐHVH HN](/su-dung-giao-trinh-new-english-file-so-cap-trong-day-ky-nang-noi-cho-sinh-vien-khong-chuyen-nam-thu-nhat-tai-dhvh-hn-5408-vi.htm)12.06.2018 [Các biện pháp nâng cao kỹ năng nghe tiếng Anh cho sinh viên không chuyên](/cac-bien-phap-nang-cao-ky-nang-nghe-tieng-anh-cho-sinh-vien-khong-chuyen-5404-vi.htm)08.06.2018 [Các chiến lược nâng cao kỹ năng viết tiếng Anh cho sinh viên không chuyên](/cac-chien-luoc-nang-cao-ky-nang-viet-tieng-anh-cho-sinh-vien-khong-chuyen-5399-vi.htm)31.05.2018 [Đôi điều cần biết khi viết sơ yếu lí lịch bằng tiếng Anh](/doi-dieu-can-biet-khi-viet-so-yeu-li-lich-bang-tieng-anh-5392-vi.htm)28.05.2018 [Làm thế nào để học tiếng Anh có hiệu quả?](/lam-the-nao-de-hoc-tieng-anh-co-hieu-qua-5388-vi.htm)23.05.2018 [Sử dụng hoạt động nhóm nhằm khuyến khích sinh viên không chuyên học kỹ năng Nói](/su-dung-hoat-dong-nhom-nham-khuyen-khich-sinh-vien-khong-chuyen-hoc-ky-nang-noi-5385-vi.htm)22.05.2018

Server: Apache


text:
Tập
hồi ký “Về Một Cuộc Ra
Đi” kể lại cuộc ra đi vượt biên bằng đường bộ của tác giả,
từ Saigon đến Biên giới Miên-Thái, qua Châu
Đốc, Nam Vang, Battambang, và Sisophon. Trên chặng đường
đi dài hàng ngàn cây số đầy gian nan nguy
hiểm, tác giả và đứa con trai mười hai tuổi đã
phải liên tục chiụ sự lo âu hồi hộp vì sợ bị lộ diện
và bị bắt lại. Trên đất Kămpuchia, ngoài những
nhân viên an ninh cộng sản, cả Việt lẫn Miên,
luôn luôn đe dọa còn nhiều sự nguy hiểm khác
rình rập những kẽ trốn đi tìm tự do: những tên cướp
cạn, những bãi mìn, những khu rừng âm u dễ
vào nhưng khó ra khỏi, sự đói khát,
và những tên lính tàn bạo vô
nhân đạo. Vì thế mà những kẻ ra đi như tác
giả đã phải vượt qua cái chết để tìm sự sống.
Không biết bao nhiêu người ra đi mà không bao
giờ đến được bờ bến mong ước. Nhiều gia đình đi năm bẩy chỉ
còn một hai, nhiều nhóm đi chung nhưng lúc đến
không còn thấy những kẻ cùng đi. Tác giả
đã may mắn sống sót để kể lại cuộc ra đi đầy kinh
hoàng, khi mà đứa con trai bị bắt lại ngay gần biên
giới Thái, ba người khác cùng đi thì một
người bị bắn chết cùng với một người dẫn đường Miên, hai
người kia không biết sống chết ra sao. Tác giả
đã vượt ngục chạy thoát để rồi một mình
cùng người dẫn đường đi trở lại lên biên giới lần
thứ hai và lần này bị lạc trong rừng tưởng đã bỏ
thân nơi
đó.
Cái gì đã thúc đẩy những kẻ như tác
giả ra đi tìm sự sống trong cái chết như vậy? Qua những
trang giấy mô tả tâm trạng và những kinh nghiệm mắt
thấy tai nghe đầy đau thương của tác giả khi đã ở lại sau
năm 1975, độc giả sẽ hiểu được tại sao bao nhiêu người đã
bỏ quê hương yêu qúi ra đi khi mà chiến tranh
đã chấm đứt, hoà bình đã trở về, khi
mà người dân đáng lẽ ra phải được sống hạnh
phúc và sung sướng và có thể đóng
góp trong công cuộc xây dựng lại một nước Việt Nam
hùng cuờng và phồn thịnh.
Hơn hai mươi năm đã trôi qua kể từ khi cuộc ra đi
này xẩy ra, những ước mơ về một quê hương thanh
bình nơi đó người dân được sống một cuộc sống của
con người với đầy đủ ý nghĩa của nó vẫn hãy
còn mịt mù, nhưng hy vọng ngày ước mơ đó sẽ
thành hình không còn xa nữa, khi mà
những biến chuyển thuận lợi đã bắt đầu xẩy ra và người
dân Việt đã ý thức được mức độ quan trọng của nền
tảng tự do và dân chủ trong sự khôi phục quê
hương.
Những sự việc xẩy ra sau năm 1975 đã bắt đầu đi vào sự
quên lãng. Tác giả mong tập hồi ký
này đóng góp được một phần nhỏ trong công
trình ghi chép lại những sự kiện lịch sử sau ngày
mất nước.
Sách
đã in
Giá bán : US $ 15
Muốn mua sách xin
liên lạc với tác giả theo địa chỉ e-mail: huongduongtxd@sbcglobal.net

P3P: policyref="http://info.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV"

Content-Type: text/html


text:
Sở GD & ĐT
Thư viện tư liệu ảnh Hướng Nghiệp
Trường THPT Hiệp BìnhTrường THCS Phước LongTrường THCS Đồng KhởiTrường THCS Yên ThếTrường THCS Nguyễn Gia ThiềuTrường THPT Nguyễn DuTrường THPT Ngô Thời NhiệmTrường THPT Nam ViệtTrường THPT Lương Thế VinhTrường THPT Long ThớiPhân hiệu THPT Lê Thị Hồng GấmTrường THCS-THPT Khai MinhTrường THPT Hùng VươngTrường THPT Hoàng Hoa ThámTrường THPT Hoa LưTrường TH-THCS-THPT Hòa BìnhTrường THPT Giồng Ông TốTrường THPT Gia ĐịnhTrường THPT Đông ĐôTrường THPT Đông ÁTrường THPT Diên HồngTrường THCS-THPT Đại ViệtTrường THCS Cửu LongTrường PTTH Chu Văn AnTrường Châu Á Thái Bình DươngTrường PTTH Bình TânTrường THPT Bình ChánhTrường THCS An Thới ĐôngTrường PTTH An Nghĩa
Hệ thống đào tạo nghề được đánh giá là một “công thức bí mật” giúp nước Đức đạt những thành tựu kinh tế đáng nể. Rất nhiều quốc gia trên thế giới nghiên cứu, học hỏi mô hình này.
Như cái tến của ngành, ngành Kỹ thuật tàu thuỷ chuyên thực hiện phân tích, thiết kế, xây dựng tàu thuỷ và công trình nổi.
Công nghệ thế kỷ XXI đòi hỏi việc giảm kích thước tối đa của các máy móc, linh kiện, phương tiện mà vẫn tăng cường được công năng của chúng. Yêu cầu trên khiến người ta phải nghĩ tới các loại vật liệu mới thay thế những vật liệu “to xác” trong quá khứ. Lời giải đáp chính là Công nghệ nano.
Đề tài "Nghiên cứu cải tiến lò cung cấp nhiệt cho máy sấy và hệ thống hút bụi cho các nhà máy chế biến chè đen" đã thành công và đem lại hiệu quả thiết thực.
Dịch vụ chăm sóc thú cưng tưởng như chỉ thấy trên những bộ phim nước ngoài thì hiện nay, đây là loại hình kinh doanh triển vọng được giới trẻ hào hứng thử sức
Từ Đại lộ Thăng Long, đi gần một kilômét, qua động Hoàng Xá, một điểm du lịch nổi tiếng ở thị trấn Quốc Oai, huyện Quốc Oai (xưa là phủ Quốc) chúng tôi đã có mặt tại thôn Du Nghệ. Đây là thôn mà người dân trong vùng vẫn gọi là thôn "bách nghệ" - trăm nghề.
Nằm rải rác trên khắp đất Yên Bái, trên những rẻo cao, lưng chừng giữa mây trời, những bản làng vắt vẻo. Mỗi bản người dân tộc Mông lại nằm khuất đâu đó ở một dãy núi. Để đi từ bản này sang bản kia, người ta phải vượt qua những ngọn núi cao. Bản làng cách nhau đến vài chục cây số đường đất.
Chúng tôi mong muốn các em có đủ thông tin để định hướng về ngành học và mục tiêu nghề nghiệp trong tương lai.
Đăng nhập
Facebook
Email
Hotline
Trở thành fan của Ngôi Nhà Xanh trên Facebook để nhận tin hot nhất từ Trung tâm Hướng Nghiệp Ngôi Nhà Xanh
Trung tâm Hướng Nghiệp Ngôi Nhà Xanh luôn mong muốn được nhận phản hồi từ bạn đọc! Mọi ý kiến hoặc bài vở đóng góp, xin vui lòng gửi về địa chỉ email:
Nếu bạn có tin tức thời sự nóng cần phản ánh trực tiếp, vui lòng liên lạc qua số điện thoại nóng sau:

Cache-Control: private