程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 用正則,從指定起始位置,在源字符串之中截取定長字符串

用正則,從指定起始位置,在源字符串之中截取定長字符串

編輯:關於PHP編程

[代碼]用正則, 從指定起始位置, 在源字符串之中截取定長字符串(含中文)[第四版]
[代碼]用正則, 從指定起始位置開始, 在源字符串之中截取一定長度的字符串[第四版]
[代碼]使用正則表達式, 從指定的起始位置開始, 在源字符串之中截取一定長度的字符串[第四次修正]
[代碼]使用正則表達式, 從字符串頭部開始, 在源字符串之中截取一定字節長度的字符串
[代碼]使用正則表達式, 從指定的起始位置開始, 在源字符串之中截取一定長度的字符串

(BTW: 中文編碼很復雜也有些不合理的地方 高位是 0xa1-0xfe (不含 0xff 因為 0xff即 255在telnet協議中有重要作用), 低位 0x40-0xfe; 而 GBK 為了和 unicode 映射把高位擴展到了 0x81-0xfe


對於最後字節是否截取錯誤中文的說明:
最後一個字節,假如截取了中文的一半,那麼應該是高位字節,其ASCII碼大於0x81的。
因為中文的高位字節都是大於0x81的,而低位字節不限。
一個完整的漢字:[0x81-0xfe][0x40-0xfe]
故使用正則表達式,依次取出漢字和非漢字,漢字優先。
最後一個字節,假如截取了中文的一半,那麼她將是一個非漢字,而且是漢字的高位字節
而判定這個字節是否在[0x81-0xfe],即可知道是否截取錯誤。

<?php

// ---------------------------------------------------------------
// File name : preg_substr.php
// Description : 使用正則表達式, 從指定的起始位置開始, 在源字符串之中截取一定程度的字符串
// -----------------------------------------------------------

/// 函數說明
/// 函數名稱 : preg_substr
/// 函數版本 : 第四次修訂
/// 函數功能 : 使用正則表達式, 從指定的起始位置開始, 在源字符串之中截取一定程度的字符串
/// 函數參數 :
/// $strSource : 源字符串
/// $intStart : 起始位置, 默認為0表示從頭開始
/// $intLen : 截取長度, 默認為32

function preg_substr($strSource, $intStart=0, $intLen=32)
{
is_int($intLen) ?0:die("len isn't a integer");
is_int($intStart) ?0:die("start isn't a integer");
if ($intStart>=0 && $intLen>0 && @preg_match('/^(.{'.$intStart.'})(.{0,'.$intLen.'})/si', $strSource)) {
@preg_match('/^(.{'.$intStart.'})(.{0,'.$intLen.'})/si', $strSource, $regs);
@preg_match_all('/([x81-xFE].|.)/sim', $regs[1], $regs1, PREG_PATTERN_ORDER);
@preg_match('/^[x81-xFE]$/',$regs1[1][count($regs1[1])-1])?$intStart--:0;

@preg_match('/^(.{'.$intStart.'})(.{0,'.$intLen.'})/si', $strSource, $regs);
@preg_match_all('/([x81-xFE].|.)/sim', $regs[2], $regs1, PREG_PATTERN_ORDER);
@preg_match('/^[x81-xFE]$/',$regs1[1][count($regs1[1])-1])?$intLen--:0;

@preg_match('/^(.{'.$intStart.'})(.{0,'.$intLen.'})/si', $strSource, $regs);

$strResult = $regs[2];
}else{
$strResult = "";
}
return $strResult;
}

function preg_substr2($strSource, $intStart=0, $intLen=32)
{
is_int($intLen) ?0:die("len isn't a integer");
is_int($intStart) ?0:die("start isn't a integer");
if ($intStart>=0 && $intLen>=0)
{
$strResult = substr($strSource, 0, $intStart);
@preg_match_all('/([x81-xFE].|.)/sim', $strResult, $regs, PREG_PATTERN_ORDER);
if(@preg_match('/^[x81-xFE]$/',$regs[1][count($regs[1])-1], $regs)){
$intStart--;
}

$strResult = substr($strSource, $intStart, $intLen);
@preg_match_all('/([x81-xFE].|.)/sim', $strResult, $regs, PREG_PATTERN_ORDER);
if(@preg_match('/^[x81-xFE]$/',$regs[1][count($regs[1])-1], $regs)){
$strResult = substr($strSource, $intStart, --$intLen);
}
}
return $strResult;
}

$strHTML = <<<HTML
ab

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved