Ngu ngơ học làm web (73) - Hàm preg_replace, lấy tỉ giá từ một website

Tiếp theo của: Ngu ngơ học làm web (72) - Hàm preg_match trong PHP
------

Phần 73.       Hàm preg_replace, lấy tỉ giá từ một website


Đây là clip số 69:


Hàm preg_replace sử dụng để tìm kiếm và thay thế một chuỗi.

Cú pháp của hàm,

$result = preg_replace($pattern, $rep, $data);

- $result: chuỗi sau khi được thay thế

- $pattern: mẫu tìm kiếm

- $rep chuỗi thay thế

- $data: chuỗi nguồn

Ví dụ,

$pattern = '/Trudeau/i';
  $rep = '<a href="http://www.google.com">Trudeau</a>';
  $data = file('du_lieu.txt') or die('Không đọc được dữ liệu');
  $data = implode('', $data);

  $result = preg_replace($pattern, $rep, $data);
  echo $result;

Ví dụ, vô hiệu nội dung JavaScript có trong văn bản:

  $pattern = array('/<script([^>]*)>/i','/<\/script([^>]*)>/i' );
  $rep = array('<pre>&lt;script\\1&gt;','&lt;script\\1&gt;</pre>');
  $data = file('du_lieu.txt') or die('Không đọc được dữ liệu');
  $data = implode('', $data);

  $result = preg_replace($pattern, $rep, $data);
  echo $result;

Lưu ý:

$pattern = array('/<script([^>]*)>/i','/<\/script([^>]*)>/i' ); //(*)

$rep = array('<pre>&lt;script\\1&gt;','&lt;script\\1&gt;</pre>'); //(**)

Kí hiệu “\1” trong (**) có nghĩa là giữ nguyên giá trị của “([^>]*)” trong (*)

Đây là clip số 70:


Để đọc nội dung của một website sử dụng hàm file_get_contents(‘đường dẫn trang web’);

Ví dụ,

$data = file_get_contents('http://www.vietcombank.com.vn/') or die('Không đọc được dữ liệu');

Đoạn mã sau lấy nội dung của một table dựa vào id.

$pattern = '/(?<=id="Content_HomeSideBar_RatesBox_ExchangeRates_ExrateView">).*(?=<\/table>)/ismu';
  $data = file_get_contents('http://www.vietcombank.com.vn/') or die('Không đọc được dữ liệu');
  preg_match($pattern, $data, $matches);
  echo '<pre>';
  print_r($matches);
  echo '</pre>';

Lưu ý:

- Kí hiệu (?<=) nghĩa là bắt đầu bằng…, (?=) nghĩa là kết thúc bằng…

- Để tìm các tham số của regular expression trong PHP sử dụng từ khóa modifiers.

- i: không phân biệt chữ hoa, chữ thường

- u: UTF-8

- m: tìm trên nhiều dòng

- s: lấy kết quả gồm nhiều dòng

- U: (PCRE_UNGREEDY) This modifier inverts the "greediness" of the quantifiers so that they are not greedy by default, but become greedy if followed by ?. It is not compatible with Perl. It can also be set by a (?U) modifier setting within the pattern or by a question mark behind a quantifier (e.g. .*?).

In kết quả tìm được dưới dạng bảng:

$result = '<table border="1">' . $matches[0] . '</table>';
echo $result;

Đưa dữ liệu từ dạng bảng vào mảng để sử dụng tiện lợi hơn, dưới đây là đoạn mã:

  // lấy bảng
  $pattern = '/(?<=id="Content_HomeSideBar_RatesBox_ExchangeRates_ExrateView">).*(?=<\/table>)/ismu';
  $data = file_get_contents('http://www.vietcombank.com.vn/') or die('Không đọc được dữ liệu');
  preg_match($pattern, $data, $matches);
  // đưa dữ liệu từ bảng vào mảng có dạng sau
  /* Array
  *(
  *  [AUD] => Array
  *     (
  *         [0] => 17,265.73 // mua tiền mặt
  *         [1] => 17,369.95 // mua chuyển khoản
  *         [2] => 17,524.89 // bán
  *      )
  *
  *  [EUR] => Array
  *      (
  *          [0] => 26,261.98
  *          [1] => 26,341.00
  *          [2] => 26,575.96
  *      )
  *...
  */
  $pattern = '/class="code">(.*)<\/td><td>(.*)<\/td><td>(.*)<\/td><td>(.*)<\/td.*\/tr>/imsU';
  preg_match_all($pattern, $matches[0], $matches);
  foreach ($matches[1] as $key => $value) {
    $result[$value][] = $matches[2][$key];
    $result[$value][] = $matches[3][$key];
    $result[$value][] = $matches[4][$key];
  }

  echo '<pre>';
  print_r($result);

  echo '</pre>';
-----------
Cập nhật [16/9/2020]
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web