第 4 章 データ処理 - php 正規表現 - Zheng Aqi (続き)
1.正则表达式基础知识
含义:由普通字符和(a-z)和一些特殊字符组成的字符串模式
功能:有效性验证。
替换文本。
从一个字符串提取一个子字符串。
分类:POSIX和Perl
POSIX风格更容易掌握,但不能用于二进制模式,而perl相对比较复杂。
2.POSIX风格的正则表达式
1.编写正则表达式
表4.3 POSIX正则表达式语法格式列表
字 符 |
描 述 |
\ |
转义字符,用于转义特殊字符。例如,'.'匹配单个字符,'\.'匹配一个点号。'\-'匹配连字符'-','\\'匹配符号'\' |
^ |
匹配输入字符串的开始位置。例如'^he'表示以'he'开头的字符串 |
$ |
匹配输入字符串的结束位置。例如,'ok$'表示以'ok'结尾的字符串 |
* |
匹配前面的子表达式零次或多次。例如,'zo*'能匹配"z"以及"zoo"。*等价于{0,} |
+ |
匹配前面的子表达式一次或多次。例如,'zo+'能匹配"zo"以及"zoo",但不能匹配"z"。+等价于{1,} |
? |
匹配前面的子表达式零次或一次。例如,'do(es)?'可以匹配"do"或"does"中的"do"。'?'等价于{0,1} |
{n} |
n是一个非负整数。匹配确定的n次。例如,'o{2}'不能匹配"Bob"中的'o',但是能匹配"food" 中的两个'o' |
{n,} |
n是一个非负整数。至少匹配n次。例如,'o{2,}'不能匹配"Bob"中的'o',但能匹配"foooood" 中的所有'o'。'o{1,}'等价于'o+'。'o{0,}'则等价于'o*' |
{n,m} |
m和n均为非负整数,其中n≤m。最少匹配n次且最多匹配m次。例如,"o{1,3}"将匹配"fooooood"中的前三个'o'。'o{0,1}'等价于'o?'。请注意在逗号和两个数之间不能有空格 |
? |
当该字符紧跟在任何一个其他限制符(*, +, ?, {n}, {n,}, {n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少地匹配所搜索的字符串,而默认的贪婪模式则尽可能多地匹配所搜索的字符串。例如,对于字符串"oooo",'o+?'将匹配单个"o",而'o+' 将匹配所有'o' |
. |
匹配除"\n"之外的任何单个字符,要匹配包括'\n' 在内的任何字符,可以使用'[.\n]'的模式 |
(pattern) |
匹配pattern并获取这一匹配。所获取的匹配保存到相应的数组中。要匹配圆括号字符,请使用 '\(' 或 '\)' |
(?:pattern) |
匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储。这在使用"或"|"来组合一个模式的各个部分时很有用。例如,'industr(?:y|ies).就是一个比'industry|industries'更简略的表达式 |
(?=pattern) |
正向预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows(?=95|98|NT|2000)'能匹配"Windows 2000"中的"Windows",但不能匹配"Windows 3.1"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
(?!pattern) |
负向预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows(?!95|98|NT|2000)'能匹配"'Windows 3.1"中的"Windows",但不能匹配"Windows 2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
x|y |
匹配x或y。例如,'z|food' 能匹配"z"或"food",'(z|f)ood'则匹配"zood"或"food" |
[xyz] |
字符集合。匹配所包含的任意一个字符。例如,'[abc]'可以匹配"plain"中的'a' |
[^xyz] |
负值字符集合。匹配未包含的任意字符。例如,'[^abc]'可以匹配"plain"中的'p' |
[a-z] |
字符范围。匹配指定范围内的任意字符。例如,'[a-z]'可以匹配'a'到'z' 范围内的任意小写字母字符 |
[^a-z] |
负值字符范围。匹配不在指定范围内的任意字符。例如,'[^a-z]'可以匹配不在'a' 到'z'范围内的任意字符 |
●'[A-Za-z0-9] ':表示所有的大写字母、小写字母及0到9的数字。
●'^hello':表示以hello开始的字符串。
●'world$':表示以world结尾的字符串。
●'.at':表示以除"\n"外的任意单个字符开头并以"at"结尾的字符串,如"cat"、"nat"等。
●'^[a-zA-Z]':表示一个以字母开头的字符串。
●'hi{2}':表示字母h后跟着两个i即hii。
●'(go)+':表示至少含有一个'go'字符串的字符串,如'gogo'
身份证号码一般由18位数字或17位数字后面加一个X或Y字母组成,要匹配身份证号码,可以写作:
^[0-9]{17}([0-9]|X|Y)$
Email地址的正则表达式可以写作:
^[a-zA-Z0-9\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$
2.字符串的匹配
ereg()和eregi()函数
使用ereg()函数可以查找字符串与子字符串匹配的情况,并返回匹配字符串的长度,还可以借助参数返回匹配字符的数组。语法格式如下:
int ereg(string ($pattern) , string $string [, array $regs ])
复制代码 代码如下:
/*本例检查字符串是否是ISO格式的日期(YYYY-MM-DD) */
$date="1988-08-09";
$len=ereg ('([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})', $date, $regs);//日期格式为YYYY-MM-DD
if ($len)
{
echo "$regs[3].$regs[2].$regs[1]". "
"; //输出"09.08.1988"
echo $regs[0] ."
"; //输出"1988-08-09"
echo $len; //输出10
}
else
{
echo "错误的日期格式: $date";
}
?>
3.字符串的替换
ereg_replace()函数语法格式如下:
string ereg_replace(string $pattern , string $replacement , string $string)
说明:函数使用字符串$replacement替换字符串$string中与$pattern匹配的部分,并返回替换后的字符串。若未找到匹配项,则原样返回
复制代码 代码如下:
$str="hello world";
echo ereg_replace('[aeo]', 'x',$str). "
"; //输出'hxllx wxrld'
$res='hello';
echo ereg_replace('hello', $res,$str); //使用超链接替换'hello'
?>
4.分割数组
使用split()函数可以完成与explode()函数一样的功能,而且可以根据给出的正则表达式来分割字符串,并返回一个数组。语法格式如下:
array split(string $pattern , string $string [, int $limit ])
5.产生正则表达式
3.Perl兼容的正则表达式
1.编写正则表达式
表4.4 Perl兼容正则表达式扩充的语法格式
字 符 |
描 述 |
\b |
匹配一个单词边界,也就是指单词和空格间的位置。例如,'er\b'可以匹配"never"中的 'er',但不能匹配"verb"中的'er' |
\B |
匹配非单词边界。'er\B'能匹配"verb"中的'er',但不能匹配"never"中的'er' |
\cx |
匹配由x指明的控制字符。例如,'\cM'匹配一个Control-M或回车符。x的值必须为A~Z或a~z之一。否则,将'c'视为一个原义的'c'字符 |
\d |
匹配一个数字字符。等价于'[0-9]' |
\D |
匹配一个非数字字符。等价于'[^0-9]' |
\f |
匹配一个换页符。等价于'\x0c'和'\cL' |
\n |
匹配一个换行符。等价于'\x0a'和'\cJ' |
\r |
匹配一个回车符。等价于'\x0d'和'\cM' |
\s |
匹配任何空白字符,包括空格、制表符、换页符等。等价于' [ \f\n\r\t\v] ' |
\S |
匹配任何非空白字符。等价于' [^ \f\n\r\t\v] ' |
\t |
匹配一个制表符。等价于'\x09'和'\cI' |
\v |
匹配一个垂直制表符。等价于'\x0b'和'\cK' |
\w |
匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]' |
\W |
匹配任何非单词字符,等价于'[^A-Za-z0-9_]' |
\xn |
匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配"A"。'\x041'则等价于'\x04' & "1"。正则表达式中可以使用ASCII编码 |
\num |
匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,'(.)\1'匹配两个连续的相同字符 |
\n |
标志一个八进制转义值或一个后向引用。如果\n之前至少有n个获取得子表达式,则n为后向引用。否则,如果n为八进制数字(0~7),则n为一个八进制转义值 |
\nm |
标志一个八进制转义值或一个后向引用。如果\nm之前至少有nm个获取得子表达式,则 nm为后向引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的后向引用。如果前面的条件都不满足,若 n和m均为八进制数字(0~7),则\nm将匹配八进制转义值nm |
\nml |
如果n为八进制数字(0~3),且m和l均为八进制数字(0~7),则匹配八进制转义值nml |
\un |
匹配n,其中n是用4个十六进制数字表示的Unicode字符。例如,'\u00A9'匹配版权符号(©) |
preg_match() 関数は文字列検索を実行します。 構文形式は次のとおりです:
int preg_match(string $pattern, string $subject [, array $matches [, int $flags ]])
説明: この関数の構造は ereg() 関数に似ています。この関数は、$subject 文字列から、$pattern で指定された正規表現に一致するコンテンツを検索します。
preg_match() 関数は、$pattern が一致した回数を返します。 preg_match() 関数は最初の一致後に検索を停止するため、0 回 (一致なし) または 1 回のいずれかです
最初の一致の終わりから検索が完了するまで検索を続ける preg_match_all() もあります. 文字列全体。
preg_match_all() 関数のパラメータ $flags の値は、次の 3 つの値を取ることができます:
●PREG_PATTERN_ORDER。デフォルトの項目は、$matches[0] がすべてのパターン一致の配列、
$matches[1] が最初の括弧内のサブパターンと一致する文字列の配列、などを意味します。
●PREG_SET_ORDER。このフラグが設定されている場合、$matches[0] は最初の一致セットの配列、$matches[1] は 2 番目の一致セットの配列、というようになります。
●PREG_OFFSET_CAPTURE。 PREG_OFFSET_CAPTURE は、他の 2 つのタグと組み合わせて使用できます。
このタグが設定されている場合、一致する結果ごとに関連する文字列オフセットも返されます。
3. 文字列の置換
preg_replace() 関数を使用すると、関数 ereg_replace() と同じ機能を実行し、文字列内で一致する部分文字列を見つけ、その部分文字列を指定された文字列に置き換えることができます。
構文形式は次のとおりです:
mixed preg_replace(mixed $pattern,mixed $replacement,mixed $subject [, int $limit])
4. 文字列分割
preg_split() 関数は使用できます。正規表現 式は文字列を分割する境界として使用され、部分文字列が配列に格納されて返されます。この関数は、split() 関数と似ています。
構文形式は次のとおりです:
array preg_split(string $pattern, string $subject [, int $limit [, int $flags ]])
説明: この関数は大文字と小文字が区別され、 $pattern に一致する境界に沿って分割された $subject 内の部分文字列を含む配列。
$limit はオプションのパラメーターです。指定すると、最大 $limit 文字列が返されます。省略するか -1 を指定すると、制限はありません。
$flags の値は次の 3 つです:
●PREG_SPLIT_NO_EMPTY。このフラグが設定されている場合、関数は空ではない文字列のみを返します。
●PREG_SPLIT_DELIM_CAPTURE。このフラグが設定されている場合、区切り文字パターン内の括弧式の一致もキャプチャされて返されます。
PREG_SPLIT_OFFSET_CAPTURE。このフラグが設定されている場合、一致が発生するたびに、関連付けられた文字列オフセットも返されます。
4.3 例 - フォームの内容を確認する
[例 4.4] 正規表現を使用して、ユーザーが入力したフォームの内容が形式要件を満たしているかどうかを確認します。
新しい EX4_4_Hpage.php ファイルを作成し、次のコードを入力します。
コードをコピーします コードは次のとおりです。
include 'EX4_4_Hpage.php' / /インクルードファイル EX4_4Hpage.php
$id=$_POST['ID'];
$phone=$_POST['PHONE']; >$Email =$_POST['EMAIL'];
$checkid=preg_match('/^w{1,10}$/',$id); //文字列が 10 文字以内かどうかを確認します
$checkpwd =preg_match('/^d{4,14}$/',$pwd); //番号が 4 ~ 14 個であるかどうかを確認します
$checkphone=preg_match('/^1d{10}$/ ' ,$phone); //1 から始まる 11 桁の番号であるかどうかを確認します
//メール アドレスの有効性を確認します
$checkEmail=preg_match('/^[a-zA-Z0- 9_-] @ [a-zA-Z0-9-] .[a-zA-Z0-9-.] $/',$Email)
if($checkid&&$checkpwd&&$checkphone&&$checkEmail) //両方が 1 の場合、登録は成功です。
echo "登録が成功しました!";
else
echo "登録に失敗しました。形式が間違っています。"
;
新建EX4_4_Ppage.php文件,输入以下代码:
2. 文字列一致
preg_match() 関数は文字列検索を実行します。 構文形式は次のとおりです:
int preg_match(string $pattern, string $subject [, array $matches [, int $flags ]])
説明: この関数の構造は ereg() 関数に似ています。この関数は、$subject 文字列から、$pattern で指定された正規表現に一致するコンテンツを検索します。
preg_match() 関数は、$pattern が一致した回数を返します。 preg_match() 関数は最初の一致後に検索を停止するため、0 回 (一致なし) または 1 回のいずれかです
最初の一致の終わりから検索が完了するまで検索を続ける preg_match_all() もあります. 文字列全体。
preg_match_all() 関数のパラメータ $flags の値は、次の 3 つの値を取ることができます:
●PREG_PATTERN_ORDER。デフォルトの項目は、$matches[0] がすべてのパターン一致の配列、
$matches[1] が最初の括弧内のサブパターンと一致する文字列の配列、などを意味します。
●PREG_SET_ORDER。このフラグが設定されている場合、$matches[0] は最初の一致セットの配列、$matches[1] は 2 番目の一致セットの配列、というようになります。
●PREG_OFFSET_CAPTURE。 PREG_OFFSET_CAPTURE は、他の 2 つのタグと組み合わせて使用できます。
このタグが設定されている場合、一致する結果ごとに関連する文字列オフセットも返されます。
3. 文字列の置換
preg_replace() 関数を使用すると、関数 ereg_replace() と同じ機能を実行し、文字列内で一致する部分文字列を見つけ、その部分文字列を指定された文字列に置き換えることができます。
構文形式は次のとおりです:
mixed preg_replace(mixed $pattern,mixed $replacement,mixed $subject [, int $limit])
4. 文字列分割
preg_split() 関数は使用できます。正規表現 式は文字列を分割する境界として使用され、部分文字列が配列に格納されて返されます。この関数は、split() 関数と似ています。
構文形式は次のとおりです:
array preg_split(string $pattern, string $subject [, int $limit [, int $flags ]])
説明: この関数は大文字と小文字が区別され、 $pattern に一致する境界に沿って分割された $subject 内の部分文字列を含む配列。
$limit はオプションのパラメーターです。指定すると、最大 $limit 文字列が返されます。省略するか -1 を指定すると、制限はありません。
$flags の値は次の 3 つです:
●PREG_SPLIT_NO_EMPTY。このフラグが設定されている場合、関数は空ではない文字列のみを返します。
●PREG_SPLIT_DELIM_CAPTURE。このフラグが設定されている場合、区切り文字パターン内の括弧式の一致もキャプチャされて返されます。
PREG_SPLIT_OFFSET_CAPTURE。このフラグが設定されている場合、一致が発生するたびに、関連付けられた文字列オフセットも返されます。
4.3 例 - フォームの内容を確認する
[例 4.4] 正規表現を使用して、ユーザーが入力したフォームの内容が形式要件を満たしているかどうかを確認します。
新しい EX4_4_Hpage.php ファイルを作成し、次のコードを入力します。
コードをコピーします コードは次のとおりです。
include 'EX4_4_Hpage.php' / /インクルードファイル EX4_4Hpage.php
$id=$_POST['ID'];
$phone=$_POST['PHONE']; >$Email =$_POST['EMAIL'];
$checkid=preg_match('/^w{1,10}$/',$id); //文字列が 10 文字以内かどうかを確認します
$checkpwd =preg_match('/^d{4,14}$/',$pwd); //番号が 4 ~ 14 個であるかどうかを確認します
$checkphone=preg_match('/^1d{10}$/ ' ,$phone); //1 から始まる 11 桁の番号であるかどうかを確認します
//メール アドレスの有効性を確認します
$checkEmail=preg_match('/^[a-zA-Z0- 9_-] @ [a-zA-Z0-9-] .[a-zA-Z0-9-.] $/',$Email)
if($checkid&&$checkpwd&&$checkphone&&$checkEmail) //両方が 1 の場合、登録は成功です。
echo "登録が成功しました!";
else
echo "登録に失敗しました。形式が間違っています。"
;
新建EX4_4_Ppage.php文件,输入以下代码:
复制代码 代码如下:
include 'EX4_4_Hpage.php'; //包含文件EX4_4Hpage.php
$id=$_POST['ID'];
$pwd=$_POST['PWD'];
$phone=$_POST['PHONE'];
$Email=$_POST['EMAIL'];
$checkid=preg_match('/^\w{1,10}$/',$id); //检查字符串是否在10个字符以内
$checkpwd=preg_match('/^\d{4,14}$/',$pwd); //检查是否在4-14个字符之间
$checkphone=preg_match('/^1\d{10}$/',$phone); //检查是否是以1开头的11位数子
//检查Email地址的合法性
$checkEmail=preg_match('/^[a-zA-Z0-9_\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$/',$Email);
if($checkid&&$checkpwd&&$checkphone&&$checkEmail) //如果都为1,则注册成功
echo "注册成功!";
else
echo "注册失败,格式不对";
?>

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHP における eol の意味とコード例を深く理解する PHP プログラミングにおいて、eol は行の終わりである「EndOfLine」を表す一般的な用語です。オペレーティング システムが異なると、行末の表現が異なる場合があり、これが eol の概念につながります。 Windows システムでは、行の終わりはキャリッジ リターン () とライン フィード ()、つまり "" で構成されますが、Unix/Linux システムでは、行の終わりはライン フィード () だけで表されます。は、 ""。このような違いにより、オペレーティング システムが異なる場合があります。

Kuaishou は中国有数のショートビデオプラットフォームとして多くのユーザーを抱えており、プライベートメッセージ機能はユーザー間の交流の重要なチャネルとなっています。ただし、プライベート メッセージにコンテンツを表示する機能が煩わしく、この機能を選択的にオフにできることを希望するユーザーもいるかもしれません。 1. Kuaishou プライベートメッセージの内容表示機能をオフにするにはどうすればよいですか? 1. Kuaishou アプリを開き、個人アカウントにログインします。 2. Kuaishou メインインターフェイスに入り、右下隅の「My」ボタンをクリックしてパーソナルセンターに入ります。 3. 個人センター ページで、アバターをクリックして個人設定を入力します。 4. 個人設定ページで、「プライバシー設定」オプションを見つけてクリックして入力します。 5. プライバシー設定ページで、[プライベート メッセージにコンテンツを表示する] オプションを見つけてクリックして入力します。 6. プライベートメッセージ表示内容設定ページで、「プライベートメッセージ表示内容」機能をオフにします

Golang の正規表現では、パイプ文字 | を使用して複数の単語または文字列を一致させ、各オプションを論理 OR 式として区切ります。例: 「fox」または「dog」に一致します: fox|dog は「quick」、「brown」または「lazy」に一致します: (quick|brown|lazy) 「Go」、「Python」または「Java」に一致します: Go| Python |Java は単語または 4 桁の郵便番号と一致します: ([a-zA

Golang は、同時実行性、効率的なメモリ管理、ネイティブ データ構造、豊富なサードパーティ ライブラリを通じてデータ処理効率を向上させます。具体的な利点は次のとおりです。 並列処理: コルーチンは複数のタスクの同時実行をサポートします。効率的なメモリ管理: ガベージ コレクション メカニズムによりメモリが自動的に管理されます。効率的なデータ構造: スライス、マップ、チャネルなどのデータ構造は、データに迅速にアクセスして処理します。サードパーティ ライブラリ: fasthttp や x/text などのさまざまなデータ処理ライブラリをカバーします。

WICCコインとは何ですか? WICCコインはWaykiChainCoinの略称で、ブロックチェーン技術をベースにしたデジタル通貨です。 WaykiChain は、効率的でスケーラブルで安全なパブリック チェーンとして、企業や開発者に完全なブロックチェーン インフラストラクチャと革新的なツールを提供することに尽力しています。 WaykiChain エコシステムの中核トークンとして、WICC Coin はプラットフォーム上で重要な役割を果たします。 WICC通貨の特徴 1. 安全性と信頼性: WaykiChainはDPoSコンセンサスアルゴリズムを採用し、信頼性の高い分散ロックメカニズムとコンセンサスメカニズムを備え、高度なネットワークセキュリティを保証します。 2. 効率的でスケーラブル: WaykiChain はミリ秒レベルのトランザクション確認速度を備え、1 秒あたり数千のトランザクションを処理できます。

MySQL ホスト名の意味と具体的な使用法 MySQL は、さまざまな Web アプリケーションで広く使用されている、人気のあるオープン ソースのリレーショナル データベース管理システムです。 MySQL では、ホスト名は重要な概念であり、データベース サーバーに接続するホストの名前を指定するために使用されます。この記事では、MySQLのホスト名の意味と実際の開発での使い方について詳しく解説します。 MySQL ホスト名の意味: MySQL では、ホスト名はどの接続が許可されるかを指定するために使用されます。

Redis を使用して Laravel アプリケーションのデータ処理効率を向上させる インターネット アプリケーションの継続的な開発に伴い、データ処理効率が開発者の焦点の 1 つになっています。 Laravel フレームワークに基づいてアプリケーションを開発する場合、Redis を使用してデータ処理効率を向上させ、データの高速アクセスとキャッシュを実現できます。この記事では、Laravel アプリケーションでのデータ処理に Redis を使用する方法を紹介し、具体的なコード例を示します。 1. Redis の概要 Redis は高性能なメモリ データです

Laravel と CodeIgniter のデータ処理機能を比較します。 ORM: Laravel はクラスとオブジェクトのリレーショナル マッピングを提供する EloquentORM を使用しますが、CodeIgniter は ActiveRecord を使用してデータベース モデルを PHP クラスのサブクラスとして表します。クエリビルダー: Laravel には柔軟なチェーンクエリ API がありますが、CodeIgniter のクエリビルダーはよりシンプルで配列ベースです。データ検証: Laravel はカスタム検証ルールをサポートする Validator クラスを提供しますが、CodeIgniter には組み込みの検証関数が少なく、カスタム ルールの手動コーディングが必要です。実践例:ユーザー登録例はLarを示しています
