1 基礎知識
正規表現は、テキストのパターンを記述する方法です。これまで使用してきた正確な (リテラル) 一致も正規表現です。たとえば、先ほどは「shop」や「delivery」などの正規表現用語を検索しました。
PHP では、正規表現の一致は、文字列内の特定の位置 (指定されていない場合、文字列内のどこにでも存在する可能性があります) にあるため、等価比較ではなく、strstr() 一致に似ています。別の文字列と一致します。たとえば、文字列「shop」は正規表現「shop」と一致します。正規表現「h」、「ho」などとも一致します。
完全に一致する文字に加えて、特殊文字を使用して式のメタ意味を指定することもできます。たとえば、特殊文字を使用すると、文字列の先頭または末尾に存在する必要があるパターン、パターンのその部分を繰り返してもよい、またはパターン内の文字が特定の種類に属することを指定できます。さらに、特殊文字の出現によって照合することもできます。次に、これらの変更について 1 つずつ説明します。
2 文字セットとクラス
文字セットを使用すると、完全一致よりも強力な正規表現を即座に提供できます。文字セットは、特定の種類の文字と一致させるために使用できます。実際、文字セットは一種のワイルドカード文字です。
まず、ワイルドカード文字として文字を使用して、改行文字 (\n) 以外の任意の文字を置き換えることができます。たとえば、正規表現
.at
は、「cat」、「sat」、「mat」などに一致します。通常、このワイルドカード マッチングは、オペレーティング システムのファイル名マッチングに使用されます。
ただし、正規表現を使用すると、一致させる文字の種類をより具体的に指定したり、文字が属するセットを指定したりできます。前の例では、正規表現は「cat」と「mat」に一致しましたが、「#at」にも一致する可能性があります。 a から z までの文字に制限したい場合は、次のように指定できます。
[a-z]at
角括弧 ([]) で囲まれた内容は文字クラスです。一致した文字です。それが属する文字セットです。に。角括弧内の式は 1 文字のみと一致することに注意してください。
たとえば、セットをリストすることができます:
[aeiou]
は母音を表すために使用できます。
は、前と同様にハイフンまたは範囲セットを使用して範囲を記述することもできます。
[a-zA-Z]
この範囲セットは、任意の大文字または小文字を表します。
さらに、セットを使用して、文字が特定のセットに属さないことを示すこともできます。例:
[^a-z]
は、a と z の間にない任意の文字と一致するために使用できます。キャレット (^) が角括弧で囲まれている場合は、「いいえ」を意味します。この記号が角括弧の外側で使用されている場合は、別の意味を意味しますが、これについては後ほど詳しく説明します。
3 繰り返し
読者は、特定の文字列または文字クラスが複数回出現することを示したいと思うことがよくあります。正規表現では代わりに 2 つの特殊文字を使用できます。 「*」はこのパターンが 0 回以上繰り返し可能であることを示し、「」はこのパターンが 1 回以上繰り返し可能であることを示します。これら 2 つのシンボルは、処理対象の式の後に配置する必要があります。
例:
[[:alnum:]]+
は「少なくとも 1 つのアルファベット文字」を意味します。
4 部分式
通常、式を複数の部分式に分割すると非常に便利です。たとえば、「少なくともこれらの文字列では、次のようにする必要があります」という意味になります。完全一致」。これは、数式と同じように括弧を使用して行うことができます。
例:
(very)*large
は、「大」、「非常に大」、「非常に大」などに一致します。
5 部分式の数
中括弧 ({}) で囲んだ数値式を使用して、コンテンツの繰り返しを許可する回数を指定できます。正確な繰り返し数 ({3} は 3 回の繰り返しを意味します)、繰り返しの範囲 ({2, 4} は 2 ~ 4 回の繰り返しを意味します)、または下限なしの繰り返し範囲 ({2, 4}) を指定できます。は 2 ~ 4 回繰り返すことを意味します)。} は少なくとも 2 回繰り返すことを意味します)。
例:
(very){1,3}
は、「非常に」、「非常に非常に」、「非常に非常に」と一致することを意味します。
6 文字列の先頭または末尾に位置する
[a-z] パターンは、小文字のアルファベットを含む任意の文字列と一致します。文字列に文字が 1 つだけ含まれているか、長い文字列全体に一致する文字が 1 つだけ含まれているかは関係ありません。
特定の部分式が先頭、末尾、または両方の位置に出現するかどうかを決定することもできます。これは、検索している単語のみが文字列内に表示され、他の単語が表示されないことを確認したい場合に便利です。
キャレット (^) は正規表現の先頭で使用され、部分文字列が検索文字列の先頭に出現する必要があることを示し、文字「$」が正規表現の末尾で使用されます。は、部分文字列が文字列の最後に表示される必要があることを示します。
たとえば、次の例は文字列の先頭の bob に一致します:
^bob
このパターンは、文字列の最後に com が表示される文字列に一致します:
com$
Finally 、このパターンは、a から z までの 1 文字のみを含む文字列と一致します:
^[a-z]$
7 Branch
可以使用正则表达式中的一条竖线来表示一个选择。例如,如果要匹配com、edu或net,就可以使用如下所示的表达式:
com|edu|net
8 匹配特殊字符
如果要匹配本节前面提到过的特殊字符,例如,.、{或者$,就必须在它们前面加一个反斜杠(\)。如果要匹配一个反斜杠,则必须用两个反斜杠(\\)来表示。
在PHP中,必须将正则表达式模式包括在一个单引号字符串中。使用双引号引用的正则表达式将带来一些不必要的复杂性。PHP还使用反斜杠来转义特殊字符——例如反斜杠。
如果希望在模式中匹配一个反斜杠,必须使用两个反斜杠来表示它是一个反斜杠字符,而不是一个转义字符。
同样,由于相同的原因,如果希望在一个双引号引用的PHP字符串中使用反斜杠字符,必须使用两个反斜杠。这可 能会有些混淆,这样要求的结果将是表示一个包含了反斜杠字符的正则表达式的一个PHP字符串需要4个反斜杠。PHP解释器将这4个反斜杠解释成2个。然 后,由正则表达式解释器解析为一个。
$符号也是双引号引用的PHP字符串和正则表达式的特殊字符。要使一个$字符能够在模式中匹配,必须使用“\\\$”。因为这个字符串被引用在双引号中,PHP解释器将其解析为\$,而正则表达式解释器将其解析成一个$字符。
9 在智能表单中应用
在智能表单应用程序中,正则表达式至少有两种用途。第一种用途是在顾客的反馈中查找特定的名词。使用正则表达 式,可以做得更智能一些。使用一个字符串函数,如果希望匹配"shop"、"customer service"或"retail",就必须做3次不同的搜索。如果使用一个正则表达式,就可以同时匹配所有3个,如下所示:
shop|customer service|retail
第二个用途是验证程序中用户的电子邮件地址,这需要通过用正则表达式来对电子邮件地址的标准格式进行编码。这 个格式中包含一些数字或标点符号,接着是符号“@”,然后是包括文字或数字和字符组成的字符串,后面接着是一个“.”(点号),后面包括文字或数字以连字 符组成的字符串,可能还有更多的点号,直到字符串结束,它的编码如下所示:
^[a-zA-Z0-9_\-.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-.]+$
子表达式^[a-zA-Z0-9_\-.]+表示“至少由一个字母、数字、下画线、连字符、点号或者这些字符组合为开始的字符串”。请注意,当在一个字符类的开始或末尾处使用点号时,点号将失去其特殊通配符的意义,只能成为一个点号字符。
符号“@”匹配字符“@”。
而子表达式[a-zA-Z0-9\-]+与包含文字数字字符和连字符的主机名匹配。请注意,我们去除了连字符,因为它是方括号内的特殊字符。
字符组合“\.”匹配“.”字符。我们在字符类外部使用点号,因此必须对其转义,使其能够匹配一个点号字符。
子表达式[a-zA-Z0-9\-\.]+$匹配域名的剩下部分,它包含字母、数字和连字符,如果需要还可包含更多的点号直到字符串的末尾。
不难发现,有时一个无效的电子邮件地址也会符合这个正则表达式。找到所有无效电子邮件几乎是不可能的,但是经 过分析,情形将会有所改善。可以按许多不同的方式精化这个表达式。例如,可以列出所有有效的顶级域(TLD)。当对某些对象进行限制的时候,请千万小心, 因为可能排斥1%的有效数据的校验函数比允许出现10%的无效数据的校验函数还要麻烦。
推荐:《PHP教程》
以上がPHP POSIX 正規表現の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。