ホームページ > バックエンド開発 > PHPチュートリアル > 正規表現を使用して、指定された開始位置のソース文字列から固定長の文字列をインターセプトする_PHP チュートリアル

正規表現を使用して、指定された開始位置のソース文字列から固定長の文字列をインターセプトする_PHP チュートリアル

WBOY
リリース: 2016-07-13 16:58:23
オリジナル
1399 人が閲覧しました

[コード]正規表現を使用して、ソース文字列(中国語を含む)から指定された開始位置から固定長文字列をインターセプトします[第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 = << 腹部

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/631416.html技術記事 [コード] 正規表現を使用して、ソース文字列 (中国語を含む) から指定された開始位置から固定長文字列をインターセプトします。 [第 4 版] [コード] 正規表現を使用して、ソース文字列 (中国語を含む) から指定された開始位置から固定長文字列をインターセプトします。指定された開始位置...
からの抜粋
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート