[コード]正規表現を使用して、ソース文字列(中国語を含む)から指定された開始位置から固定長文字列をインターセプトします[第4版]
[コード] 通常のルールを使用して、指定された開始位置から始まるソース文字列から特定の長さの文字列をインターセプトします [第 4 版]
【コード】正規表現を使って、指定した開始位置からソース文字列から一定の長さの文字列をインターセプトする【第四改訂】
【コード】正規表現を使ってソース文字列から一定バイト長の文字列を先頭から切り出します
【コード】正規表現を使用して、指定された開始位置から始まるソース文字列から一定の長さの文字列をインターセプトします
(ところで: 中国語のエンコーディングは非常に複雑で、やや不合理です。上位ビットは 0xa1 ~ 0xfe (255 である 0xff は Telnet プロトコルで重要な役割を果たすため、0xff を除く)、下位ビットは 0x40 ~ 0xfe です。GBK上位ビットを 0x81-0xfe に拡張しました
。
最後のバイトが間違った中国語でインターセプトされるかどうかについての説明:
漢字の半分がインターセプトされた場合、最後のバイトは上位バイトである必要があり、その ASCII コードは 0x81 より大きくなります。
中国語の上位バイトは 0x81 より大きいですが、下位バイトには制限がないためです。
完全な漢字: [0x81-0xfe][0x40-0xfe]
したがって、正規表現を使用して、中国語と中国語以外の文字を順番に抽出します。中国語が優先されます。
最後のバイト、漢字の半分が傍受されると、それは非漢字となり、漢字の上位バイトになります
そして、このバイトが[0x81-0xfe]にあるかどうかを判断することで、インターセプトが間違っているかどうかを知ることができます。
//------------------------------------------------ ---------------
// ファイル名:preg_substr.php
// 説明: 正規表現を使用して、指定された開始位置から始まるソース文字列から一定量の文字列をインターセプトします
//------------------------------------------------ ----------
/// 関数の説明
/// 関数名: preg_substr
/// 関数バージョン: 4 番目のリビジョン
/// 関数: 正規表現を使用して、指定された開始位置から始まるソース文字列からある程度の文字列をインターセプトします
/// 関数パラメータ:
/// $strSource : ソース文字列
/// $intStart: 開始位置、デフォルトは 0 で、最初から開始することを意味します
/// $intLen: 切片の長さ、デフォルトは 32 です
関数 preg_substr($strSource, $intStart=0, $intLen=32)
{
is_int($intLen) ?0:die("len は整数ではありません");
is_int($intStart) ?0:die("開始値が整数ではありません");
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];
}その他{
$strResult = "";
}
$strResult を返します;
}
関数 preg_substr2($strSource, $intStart=0, $intLen=32)
{
is_int($intLen) ?0:die("len は整数ではありません");
is_int($intStart) ?0:die("開始値が整数ではありません");
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);
}
}
$strResult を返します;
}
$strHTML = <<
腹部