ホームページ  >  記事  >  php教程  >  正規表現を 30 分でマスターする

正規表現を 30 分でマスターする

WBOY
WBOYオリジナル
2016-06-21 08:58:52907ブラウズ

正则

想必很多人都对正则表达式都头疼.今天,我以我的认识,加上网上一些文章,希望用常人都可以理解的表达方式.来和大家分享学习经验.

  开篇,还是得说说 ^  和  $  他们是分别用来匹配字符串的开始和结束,以下分别举例说明


"^The": 开头一定要有"The"字符串;
"of despair$":  结尾一定要有"of despair" 的字符串;

那么,
"^abc$": 就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配
"notice": 匹配包含notice的字符串


你可以看见如果你没有用我们提到的两个字符(最后一个例子),就是说 模式(正则表达式) 可以出现在被检验字符串的任何地方,你没有把他锁定到两边

接着,说说 '*', '+',和 '?',
他们用来表示一个字符可以出现的次数或者顺序. 他们分别表示:
"zero or more"相当于{0,},
"one or more"相当于{1,}, 
"zero or one."相当于{0,1},  这里是一些例子:


"ab*":  和ab{0,}同义,匹配以a开头,后面可以接0个或者N个b组成的字符串("a", "ab", "abbb", 等);
"ab+": 和ab{1,}同义,同上条一样,但最少要有一个b存在 ("ab", "abbb", 等.);
"ab?":和ab{0,1}同义,可以没有或者只有一个b;
"a?b+$": 匹配以一个或者0个a再加上一个以上的b结尾的字符串.

要点, '*', '+',和 '?'只管它前面那个字符.


你也可以在大括号里面限制字符出现的个数,比如


"ab{2}": 要求a后面一定要跟两个b(一个也不能少)("abb");
"ab{2,}": 要求a后面一定要有两个或者两个以上b(如"abb", "abbbb", 等.);
"ab{3,5}": 要求a后面可以有2-5个b("abbb", "abbbb", or "abbbbb").

现在我们把一定几个字符放到小括号里,比如:

"a(bc)*": 匹配 a 后面跟0个或者一个"bc";
"a(bc){1,5}": 一个到5个 "bc."


还有一个字符 '│', 相当于OR 操作:


"hi│hello": 匹配含有"hi" 或者 "hello" 的 字符串;
"(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字符串;
"(a│b)*c": 匹配含有这样多个(包括0个)a或b,后面跟一个c
的字符串;


一个点('.')可以代表所有的单一字符,不包括"\n"

如果,要匹配包括"\n"在内的所有单个字符,怎么办?

对了,用'[\n.]'这种模式.


"a.[0-9]": 一个a加一个字符再加一个0到9的数字
"^.{3}$": 三个任意字符结尾 .


中括号括住的内容只匹配一个单一的字符


"[ab]": 匹配单个的 a 或者 b ( 和 "a│b" 一样);
"[a-d]": 匹配'a' 到'd'的单个字符 (和"a│b│c│d" 还有 "[abcd]"效果一样); 一般我们都用[a-zA-Z]来指定字符为一个大小写英文
"^[a-zA-Z]": 匹配以大小写字母开头的字符串
"[0-9]%": 匹配含有 形如 x% 的字符串
",[a-zA-Z0-9]$": 匹配以逗号再加一个数字或字母结尾的字符串


你也可以把你不想要得字符列在中括号里,你只需要在总括号里面使用'^' 作为开头 "%[^a-zA-Z]%" 匹配含有两个百分号里面有一个非字母的字符串.

要点:^用在中括号开头的时候,就表示排除括号里的字符 

为了PHP能够解释,你必须在这些字符面前后加'',并且将一些字符转义.

不要忘记在中括号里面的字符是这条规路的例外—在中括号里面, 所有的特殊字符,包括(''), 都将失去他们的特殊性质 "[*\+?{}.]"匹配含有这些字符的字符串.

 还有,正如regx的手册告诉我们: "如果列表里含有 ']', 最好把它作为列表里的第一个字符(可能跟在'^'后面). 如果含有'-', 最好把它放在最前面或者最后面, or 或者一个范围的第二个结束点[a-d-0-9]中间的‘-’将有效.

看了上面的例子,你对{n,m}应该理解了吧.要注意的是,n和m都不能为负整数,而且n总是小于m. 这样,才能 最少匹配n次且最多匹配m次. 如"p{1,5}"将匹配 "pvpppppp"中的前五个p

下面说说以\开头的

\b 书上说他是用来匹配一个单词边界,就是...比如've\b',可以匹配love里的ve而不匹配very里有ve

\B 正好和上面的\b相反.例子我就不举了

.....突然想起来....可以到http://www.phpv.net/article.php/251 看看其它用\ 开头的语法

好,我们来做个应用:

如何构建一个模式来匹配 货币数量 的输入

入力情報がお金を表す数字であるかどうかを確認するための一致パターンを構築します。金額を表す方法は 4 つあると思います。「10000.00」と「10,000.00」、または小数部分を省略した「10000」と「10,000」です。次に、この一致パターンの構築を開始しましょう:

^。 [ 1-9][0-9]*$

これは、すべての変数が 0 以外の数値で始まらなければならないことを意味しますが、単一の "0" は渡せないことも意味します。テストです。解決策は次のとおりです:

^(0│[1-9][0-9]*)$

「0 と 0 で始まらない数字のみが一致します」数値の前に負の符号を付けることもできます:

^(0│-?[1-9][0-9]*)$

これは次のようになります: "0 または 0 で始まる数値、および の前にマイナス記号が付いている可能性があります。」 さて、ここではあまり厳密ではなく、0 から始まることを許可しましょう。次に、マイナス記号を削除しましょう。コインを表すときは必要ありません:

^[0-9]+(.[0-9]+)?$

これは、小数部分と一致するパターンを指定します。一致する文字列は少なくともアラビア数字で始まる必要がありますが、上記のパターンでは「10.」は一致せず、「10」と「10.2」のみが一致することに注意してください (理由はわかりますか)

^[0-9]+(.[0-9]{2})?$

上で、小数点の後に小数点以下 2 桁が必要であると指定しましたが、これは厳しすぎると思われるかもしれません。次のように変更できます:

^[0-9]+(.[0-9]{1,2})?$

これにより、小数点の後に 1 文字または 2 文字が許可されます。読みやすくするためにカンマ (3 桁ごと) を追加すると、次のように表すことができます:

^[0-9]{1,3}(,[0-9]{3}) *(. [0-9]{1,2})?$

空白文字列の入力を許可する場合は、

'+' を '*' に置き換えることを忘れないでください。 (なぜですか?) また、PHP 文字列でエラーを引き起こす可能性があるバックスラッシュ '' も忘れないでください (非常に一般的なエラー)。

文字列を確認できたので、すべてのカンマを削除します。 str_replace(",", "", $money) を使用し、その型を double として扱うと、それを通じて数学的な計算を行うことができます。


もう 1 つあります:

電子メールをチェックするための正規表現を作成します

完全な電子メール アドレスには 3 つの部分があります:

1. ユーザー名 (「@」の左側のすべて) 、
2.'@'、
3. サーバー名 (残りの部分)

ユーザー名には、大文字、小文字、アラビア数字、ピリオド ('.')、マイナスを含めることができます。 ('-') およびアンダースコア ('_') もこのルールに従いますが、もちろんアンダースコアは除きます。ユーザー名の先頭と末尾にはピリオドを使用できません。同じことがサーバーにも当てはまります。 また、2 つの連続するピリオドの間に少なくとも 1 文字を入れることはできません。ここで、ユーザー名に一致するパターンを記述する方法を見てみましょう:

^[_a- zA-Z0-9-]+ $

ピリオドはまだ使用できません。

^[_a-zA-Z0-9-]+(.[_a-zA] -Z0-9- ]+)*$

上記は、「少なくとも 1 つの正規文字 (. を除く) で始まり、その後にドットで始まる 0 個以上の文字列が続く」ことを意味します。 > 少し簡略化するために、 ereg() の代わりに eregi() を使用できます。 eregi() は大文字と小文字を区別しないため、「a-z」と「A-Z」の 2 つの範囲を指定する必要はありません。指定する必要があるのは 1 つだけです。 :

^[_a-z0-9-]+(.[_a-z0-9-]+)*$

の後のサーバー名は同じですが、アンダースコアが必要です削除されました:

^[a-z0-9-]+(.[a-z0-9-]+)*$

それでは、「@」を使用して 2 つを接続します。パーツ:

^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-] ]+)*$

これは完全な電子メール認証照合モードです。

eregi('^[_a-z0-9-]+(.[_a-z0 -9-] +)*@[a-z0-9-]+(.[a-z0-9-]+)*$ ',$eamil)

メールかどうかを取得できます
正規表現 式のその他の使用法

文字列の抽出

ereg() および eregi() には、ユーザーが正規表現を使用して文字列の一部を抽出できる機能があります (たとえば、パス/URL からファイル名を抽出したいとします。必要なのは次のコードです:

ereg("([^\/]*)$", $ pathOrUrl, $regs);

echo $regs[1];

高度な置換

ereg_replace() と eregi_replace() も非常に便利です。カンマ付きの記号:

ereg_replace("[ nrt]+", ",",trim($str));

最後に、チェック用の正規表現の別の文字列を入れます。ご覧になるメール 記事を分析してください。

"
^[-!#$%&'*+\./0-9=?A-Z^_`a-z{|}~]+'。 ' @'.'[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+.'.'[-!#$%&'*+\./ 0 -9=?A-Z^_`a-z{|}~]+$

"

簡単に理解できれば、この記事の目的は達成されます。

別の : 上記の記事に誤りを見つけた場合は、修正してください。転載する場合は、このページへのリンクがあることを確認してください

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。