PHP の正規の関係

不言
不言オリジナル
2018-04-23 13:55:081578ブラウズ

この記事の内容は、特定の参考値を持つ PHP の正規関係に関するものです。必要な友達に参考にしてください。

概要

正規表現は説明文字です。文字列結果の構文規則は、一致する文字列と一致、置換、およびインターセプトできる特定の書式設定パターンです。 JavaScript や Java など、一般的に使用される言語には基本的に正規表現があります。実際、ある言語の通常の使用法を理解していれば、他の言語の通常のルールを使用することは比較的簡単です。このテキストは主に次の問題を解決することに焦点を当てています。よく使用されるエスケープ文字とは何ですか? 逆参照とは何ですか?

  • マッチングパターン

  • php で正規表現を使用する必要があるのはどのような点ですか?

  • 電子メール マッチング、URL マッチング、携帯電話マッチングを実行する方法

  • 方法 正規表現を使用して文字列内の特定の文字を置換する

  • 貪欲マッチングと遅延マッチングの違い

  • 正規表現のバックトラッキングと確実なグループ化

  • 正規表現のメリットとデメリットとは

  • 正規表現の基礎知識まとめ

    行ロケーター(^と$)
  • 行ロケーターは文字列の境界を記述するために使用されます。 "$" は行の終わりを表します。 "^" は行の始まりを表します ("^de" など)。 de " de$" で始まる文字列は、de で終わる文字列を表します。

    単語区切り文字

  • 文字列 "gril and body" に an が存在するかどうかなど、単語を検索するとき、それが一致する場合、an は文字列 "gril and body" "body" に確実に一致することが明らかです。 " が一致します。単語の一部ではなく単語と一致させるにはどうすればよいですか?このとき、単語の区切り文字 b にすることができます。
    banb が「グリルとボディ」に一致する場合、一致できないことを示すメッセージが表示されます。
    もちろん、大文字の B があります。これは b の正反対の意味です。一致する文字列は完全な単語ではなく、他の単語または文字列の一部となります。バンBなど。
  • またはを表す文字 (|) を選択します。

    またはを表す文字を選択します。たとえば、Aa|aA は Aa または aA を意味します。 「[]」と「|」の使用の違いは、「[]」は単一の文字にのみ一致するのに対し、「|」は任意の長さの文字列に一致することです。 「[]」を使用する場合は、a または b または c または d を表す [a-d] のように、接続文字「-」と一緒に使用されることがよくあります。
  • 文字の除外、操作の除外

  • 正規表現では、一致しない文字を除外するために「^」を指定します。^ は通常 [] の中に配置されます。たとえば、[^1-5] の場合、この文字は 1 から 5 までの数字ではありません。

    修飾子 (?*+{n, m})

  • 修飾子は主に各文字列の出現数を制限するために使用されます。

  • 限定キャラクター

  • 意味

? “$”表示行结尾“^”表示行开始如"^de",表示以de开头的字符串 "de$",表示以de结尾的字符串。

单词定界符

我们在查找的一个单词的时候,如an是否在一个字符串”gril and body”中存在,很明显如果匹配的话,an肯定是可以匹配字符串“gril and body”匹配到,怎样才能让其匹配单词,而不是单词的一部分呢?这时候,我们可以是哟个单词定界符b。 
banb 去匹配”gril and body”的话,就会提示匹配不到。 
当然还有一个大写的B,它的意思,和b正好相反,它匹配的字符串不能使一个完整的单词,而是其他单词或字符串中的一部分。如BanB。

选择字符(|) ,表示或

选择字符表示或的意思。如Aa|aA,表示Aa或者是aA的意思。注意使用”[]”与”|”的区别,在于”[]”只能匹配单个字符,而”|”可以匹配任意长度的字符串。在使用”[]”的时候,往往配合连接字符”-“一起使用,如[a-d],代表a或b或c或d。

排除字符,排除操作

正则表达式提供了”^”来表示排除不符合的字符,^一般放在[]中。如[^1-5],该字符不是1~5之间的数字。

限定符(?*+{n,m})

限定符主要是用来限定每个字符串出现的次数。

限定字符 含义
零次或一次
* 零次或多次
+ 一次或多次
{n} n次
{n,} 至少n次
{n,m} n到m次

如(D+)表示一个或多个D

点号操作符

匹配任意一个字符(不包含换行符)

表达式中的反斜杠(

0回または1回

*

0回以上

+{n}n回で最低 n 回n から m 回たとえば、(D+) は 1 つ以上の D を表します

ドット演算子

式内のバックスラッシュ ()

式内のバックスラッシュには、エスケープ、定義済みの文字セットの指定、アサーションの定義、印刷不可能な文字の表示など、複数の意味があります。 エスケープ文字エスケープ文字は主に一部の特殊文字を通常の文字に変換します。一般的に使用される特殊文字には、「.」、「?」、「" などが含まれます。 定義済みの文字セットを指定します意味
1回以上
{n,}
{n,m}
は任意の文字と一致します (改行文字は含まれません) )
文字

dD任意番号 任意の空白文字 (スペース、ラインフィード、フォームフィード、キャリッジリターン、タブ文字)空白以外の任意の文字任意の単語文字任意単語以外の文字 ###印刷できない文字を表示する 意味
任意の10進数[0-9]
s
S
w
W
文字
🎜🎜🎜a🎜🎜アラーム 🎜🎜🎜🎜b🎜 🎜バックスペース🎜🎜🎜🎜f🎜🎜ページ変更🎜🎜🎜🎜n🎜🎜改行🎜🎜🎜🎜r🎜🎜Enter🎜🎜🎜🎜t🎜🎜文字🎜🎜 🎜🎜

括弧文字 ()

正規表現における括弧の主な機能は次のとおりです:

  • (|、*、^) などの修飾子の範囲を変更します
    (my|your)baby のように、" がない場合は、 () ", | は my または yourbaby のいずれかに一致します。括弧を使用すると、mybaby または yourbaby のいずれかに一致します。

  • 簡単な後方参照のためのグループ

後方参照

後方参照は、部分式の「メモリ」機能に依存して、連続する文字列または文字と一致します。たとえば、(dqs)(pps)12 は、文字列 dqsppsdqspps と一致することを意味します。次の PHP アプリケーションでは、後方参照について詳しく学習します。

パターン修飾子

パターン修飾子の役割は、パターン、つまり正規表現がどのように解釈されるかを設定することです。 PHP の主なモードは次のとおりです:

Modifier 説明
i 大文字と小文字を区別しない
m 複数のテキストモード
s 単一行テキストモード
x 空白文字を無視します

正規表現は php で適用されます

php での文字列マッチング

いわゆる文字列マッチングは、暗黙的に、ある文字列に別の文字列が含まれるか、またはそれと等しいかどうかを判断することです。正規表現を使用しない場合は、PHP で提供されている多くのメソッドを使用してそのような判断を行うことができます。

通常のマッチングは使用しないでください

  • strstr関数
    string strstr ( string haystack,mix e針[, bool $before_needle = false ])

    • 注1: hayst ckのとき、物事文字記号文字列のとき、needleは検索される文字列です。この関数では大文字と小文字が区別されます。

    • 注2: 戻り値は先頭から末尾までです。針。

    • 注3: $needleに関しては、文字列でない場合は整数として扱われ、キャラクターの通し番号として使用されます。

    • 注 4: before_needle が true の場合、前のものを返します。

  • strstr 関数は、大文字と小文字が区別されない点を除いて、strstr 関数と同じです。 c

    k
  • ,
  • m

    i
    xedneedle [, int $offset = 0 ] ) 注 1: オプションの offset パラメーターを使用して、干し草の山内のどの文字から検索を開始するかを指定できます。返される数値位置は、干し草の山の開始位置を基準としています。
    stripos - 文字列
    が最初に出現する位置を検索します
    (
    はサイズに依存しません
    )
    strrpos - を計算します。指定された文字列 ターゲット文字列内の
    の最後の
    出現の位置

  • strripos - ターゲット文字列内での指定された文字列の最後の

    出現の位置を計算します (大文字と小文字は区別されません)

  • 通常を使用しますマッチングのための式
  • php では、通常のマッチングのために preg_math() 関数と preg_match_all 関数が提供されています。これら 2 つの関数のプロトタイプは次のとおりです:

    int preg_match|preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

    件名とパターンで指定された正規表現の間の一致を検索します。
    パターン: 検索するパターン、文字列タイプ。
    件名: 文字列を入力します。
    matches: パラメータのmatchesが指定されている場合、それが検索結果として入力されます。 matches[0]パッケージが含まれます仕上げ フルモデルmatchmatch textthis に一致させる、matches[1] には最初のキャプチャ サブグループによって一致したテキストが含まれます、など。 flags: フラグは次のフラグ値に設定できます: PREG_OFFSET_CAPTURE このフラグが渡されると、一致が発生するたびに文字列オフセット (ターゲット文字列を基準とした) が返されます。 注: これにより、matches パラメータに入力された配列が変更され、各要素が 0 番目の要素が一致した文字列、最初の要素がターゲット文字列 subject 内の一致した文字列のオフセットとなる文字列になります。 オフセット: 通常、検索はターゲット文字列の先頭から開始されます。オプションのパラメータ offset は、ターゲット文字列内の未知の点から開始する検索を指定するために使用されます (単位はバイト)。 戻り値: preg_match() はパターンの一致数を返します。 preg_match() は最初の一致後に検索を停止するため、その値は 0 (一致なし) または 1 になります。 preg_match_all() はこれとは異なり、件名を最後まで検索します。 エラーが発生した場合、preg_match() は FALSE を返します。


    例 1
      文字列 "http://blog.csdn.net/hsd2012" に csdn が含まれているかどうかを確認します
    • 解決策 1 (通常のルールは適用されません):

      通常のルールの場合ここでは、strstr 関数を使用します。コードは次のとおりです。


      $str='http://blog.csdn.net/hsd2012';function checkStr1($str,$str2)
      {    return strstr1($str,$str2)?true:false;
      }echo checkStr($str,'csdn');

      解決策 2: 通常のルールを使用する
    • 存在するかどうかを判断するだけなので、 preg_match を選択します。
    $str='http://blog.csdn.net/hsd2012';$pattern='/csdn/';function checkStr2($str,$str2)
    {    return preg_match($str2,$str)?true:false;
    }echo checkStr2($str,$pattern);


    例 2 (
      単語区切り文字
    • の検査)

      文字列「私は良い子です」に go という単語が含まれているかどうかを判断します 最初にそれが文字列ではなく単語であることを判断するため、比較するときに次のことが必要です「go」が含まれているかどうか、つまり、文字列 go の前後にスペースがあるかどうかを比較します。 分析: 非正規比較を使用する場合は、上記の checkStr1() 関数を呼び出すだけで済みます。2 番目のパラメーター、つまり 'go' の前後にスペースを追加する必要があることに注意してください。正規表現を使用する場合は、単語区切り文字 b を使用して、$pattern='/bgob/'; を使用してから、checkStr2 関数を呼び出すことを検討できます。 例 3 (
      バックリファレンス
      の検査)
      文字列を判定します。 「私は良い子です」には同じ文字が 3 つ含まれています
      分析: このとき、正規表現を使用しないと、文字数が多すぎてすべての文字を区別することができないため、判断が難しくなります。文字列比較の場合、作業負荷は比較的大きくなります。この時間には、現在の後方参照が含まれます。 PHP 正規表現では、n は n 番目の一致の結果を表すために使用されます。たとえば、5 は 5 番目の一致結果を表します。したがって、この質問で注意すべき主な点は、逆引き一致を使用する場合は () 内に表示される文字または文字列と一致するようにする必要があるということです。

    • phpでの文字列置換正規表現は使用しません

      phpで文字列を置換する場合、正規表現が適用されない場合は、通常、substr、mb_substr、str_replace、substr_replaceを使用します。これらの関数の違いは次のとおりです。 $pattern='/(w).*1.*1/';

      関数シンボル 関数 説明
      str_replace(find,replace,string,count) 文字列を使用して、文字列内の他の文字を置き換えます。 必要なものを見つけてください。検索する値を指定します。交換が必要です。 find の値を置き換える値を指定します。文字列が必要です。検索する文字列を指定します。カウントはオプションです。置換の数をカウントする変数。
      substr_replace(string,replacement,start,length) 文字列の一部を別の文字列に置換します。カスタムの場所で文字列を置き換えるのに適しています。 文字列が必要です。チェックする文字列を指定します。交換が必要です。挿入する文字列を指定します。開始が必要です。文字列内のどこから置換を開始するかを指定します。

      正規表現を使用する

      正規表現置換を使用する場合、PHP には preg_replace _callback 関数と preg_replace 関数が用意されています。 preg_replace のプロトタイプは次のとおりです。混合 preg_replace (混合 pattern,mixedreplacement、混合su) bje ct[,intlimit = -1 [, int &count]])レター カウント 関数describedescription: 文字シンボルにあります文字列件名 pat tenranの後ある場合はを使用して置き換えてくださいlimit それでは 代替品limitedmadesubstitutereplacementliiittimespregreplacecallbackpregreplace识,不同的是pregreplaceback使用一个回调函数callback来代替replacement.−例1将字符串”hello,中国”中的hello替换为′你好′;如果不是用正则:str=’hello,中国’; str=strreplace(′hello′,′你好′,str) 或是使用str=substrreplace(str,’你好’,0,5) 使用正则 pattern=′/hello/′;str=preg_replace (pattern,′你好′,str); - 例2 去除字符串”gawwenngeeojjgegop”中连续相同的字母

      $str='gawwenngeeojjgegop';$pattern='/(.)\1/';$str=preg_replace($pattern,'',$str);

      解析:当然这样可能会遇到,当第一次去除了重复了字符串后,又出来重复的字符串。如字符串味’gewwenngeeojjgegop’,针对这中问题,当然,这样的话,通过判断,继续替换下去。

      • 例3 
        将字符串中”age13gegep3iorji65k65k”;中出现的连续两个数字改为第二个数字,如字符串中13被改为3

      $str='age13gegep3iorji65k65k';$pattern='/(\d)(\d)/';$str=preg_replace($pattern,'$2', $str);

      解析:$n在正则表达式外使用反向引用。n代表第几次匹配到的结果。

      php中字符串分割

      不适用正则

      php提供了explode函数去分割字符串,与其对应的是implode。关于explode原型如下: 
      array explode ( string delimiter,stringstring [, int $limit ] ) 
      delimiter:边界上的分隔字符。 
      string:输入的字符串。 
      limit:如果设置了 limit 参数并且是正数,则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。如果 limit 参数是负数,则返回除了最后的 -limit 个元素外的所有元素。如果 limit 是 0,则会被当做 1。

      使用正则

      关于通过正则表达式进行字符串分割,php提供了split、preg_split 函数。preg_split() 函数,通常是比 split() 更快的替代方案。 
      array preg_split ( string pattern,stringsubject [, int limit=1[,intflags = 0 ]] )

      • 例题 
        将字符串 ‘http://blog.csdn.net/hsd2012/article/details/51152810‘按照’/’进行分割 
        解法一:

      $str='http://blog.csdn.net/hsd2012/article/details/51152810';$str=explode('/', $str);

      解法二:

      $str='http://blog.csdn.net/hsd2012/article/details/51152810';$pattern='/\//';  /*因为/为特殊字符,需要转移*/$str=preg_split ($pattern, $str);

      php中贪婪匹配与惰性匹配

      • 贪婪匹配:就是匹配尽可能多的字符。 
        比如,正则表达式中m.*n,它将匹配最长以m开始,n结尾的字符串。如果用它来搜索manmpndegenc的话,它将匹配到的字符串是manmpndegen而非man。可以这样想,当匹配到m的时候,它将从后面往前匹配字符n。

      • 懒惰匹配:就是匹配尽可能少的字符。 
        有的时候,我们需要并不是去贪婪匹配,而是尽可能少的去匹配。这时候,就需要将其转为惰性匹配。怎样将一个贪婪匹配转为惰性匹配呢?只需要在其后面添加一个”?”即可。如m.*?n将匹配manmpndegenc,匹配到的字符串是man。

      函数符 描述
      *? 零次或多次,但尽可能少的匹配
      +? 一次或多次,但尽可能少的匹配
      ?? 0次或1次,但尽可能少的匹配
      {n,}? 至少n次,但尽可能少的匹配
      {n,m}? n到m次 ,但尽可能少的匹配

      php正则表达式之回溯与固态分组

      回溯

      首先我们需要清楚什么是回溯,回溯就像是在走岔路口,当遇到岔路的时候就先在每个路口做一个标记。如果走了死路,就可以照原路返回,直到遇见之前所做过的标记,标记着还未尝试过的道路。如果那条路也走不能,可以继续返回,找到下一个标记,如此重复,直到找到出路,或者直到完成所有没有尝试过的路。首先我们看例题

      $str='aageacwgewcaw';$pattern='/a\w*c/i';$str=preg_match($pattern, $str);

      看到上面的程序,可能都清楚是什么意思,就是匹配$str是否包含这样一个由”a+0个或多个字母+c”不区分大小写的字符串。但是至于程序怎样去匹配的呢?匹配的过程中,回溯了多少次呢?

      匹配过程 接下来操作描述
      ‘a\w*c’中a匹配到’aageacwgewcaw’中第一个字符a \w进行下一个字符匹配
      因为\w是贪婪匹配,会一直匹配到’aageacwgewcaw’中最后一个字符w c进行下一个字符匹配时
      ‘a\w*c’中c发现没有可以匹配的 于是\w匹配进行第一次回溯,匹配到倒数第二个字符a
      ‘a\w*c’中c发现还是没有可以匹配的 于是\w匹配进行第二次回溯,匹配到倒数第三个字符c
      ‘a\w*c’中c匹配成功 匹配结束返回结果

      现在,如果我们将pattern为pattern=’/a\w*?c/i’;又会回溯多少次呢?正确答案是回溯四次。

      固态分组

      固态分组,目的就是减少回溯次数, 使用(?>…)括号中的匹配时如果产生了备选状态,那么一旦离开括号便会被立即 引擎抛弃掉。举个典型的例子如: ‘\w+:’这个表达式在进行匹配时的流程是这样的,会优先去匹配所有的符合\w的字符,假如字符串的末尾没有’:’,即匹配没有找到冒号,此时触发回溯机制,他会迫使前面的\w+释放字符,并且在交还的字符中重新尝试与’:’作比对。但是问题出现在这里: \w是不包含冒号的,显然无论如何都不会匹配成功,可是依照回溯机制,引擎还是得硬着头皮往前找,这就是对资源的浪费。所以我们就需要避免这种回溯,对此的方法就是将前面匹配到的内容固化,不令其存储备用状态!,那么引擎就会因为没有备用状态可用而只得结束匹配过程。大大减少回溯的次数。 
      如下代码,就不会进行回溯:

      $str='nihaoaheloo';$pattern='/(?>\w+):/';$rs=preg_match($pattern, $str);

      当然有的时候,又需慎用固态分组,如下,我要检查$str中是否包含以a结尾的字符串,很明显是包含的,但是因为使用了固态分组,反而达不到我们想要的效果

      $str='nihaoahelaa';$pattern1='/(?>\w+)a/';$pattern2='/\w+a/';$rs=preg_match($pattern1, $str);//0$rs=preg_match($pattern2, $str);//1

      php中其他常用字符串操作函数

      • 字符串截取截取 
        string substr ( string string,intstart [, int length])stringmbsubstr(stringstr , int start[,intlength = NULL [, string $encoding = mb_internal_encoding() ]] )

      • 字符串中大小写转换 
        strtoupper 
        strtolower 
        ucfirst 
        ucwords

      • 字符串比较 
        -strcmp、strcasecmp、strnatcmp

      • 字符串过滤

      • 字符串翻转 
        strrev($str);

      • 字符串随机排序 
        string str_shuffle ( string $str )

      補足

      メールマッチング、URLマッチング、携帯電話マッチングのやり方

      マッチングにはpreg_match関数を使用します 以下の内容はTPよりコピーです。
      メール認証
      pattern=/w+([+ .]w +)@w+([.]w+).w+([.] w +)∗/';
      URL 一致
      pattern='/^http(s?)://(?:[A-za-z0-9-]+.)+[A-za -z]{2,4}(:d+)?(?:[/?#][/=?%-&~`@[]':+!.#w]*)?/';検証

      pattern=/1[3458]d 10/';

      PHP の正規表現の長所と短所

      PHP の正規表現は次のことができます。時には、PHP 関数の多くの困難な一致や置換の解決に協力してください。次に、多くの場合、PHP での正規表現の効率を考慮する必要があるため、特定の状況で正規表現を使用する必要がない限り、正規表現の使用を回避できる場合は、正規表現を使用しないようにする必要があります。そうしないと、効果的に正規表現を削減できます。バックトラックの数。

      関連する推奨事項:


      PHP 正規表現 (177 の携帯電話番号を追加)

      PHP 正規表現の共有

以上がPHP の正規の関係の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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