ホームページ  >  記事  >  バックエンド開発  >  PHPの正規表現

PHPの正規表現

WBOY
WBOYオリジナル
2016-08-08 09:20:07858ブラウズ

正規表現とは

正規表現は、文字列を操作する論理式で、いくつかの特定の文字を組み合わせて正規の文字列を作成し、これを正規一致パターンと呼びます。

$p = '/apple/'; $str = "apple banna"; if (preg_match($p, $str)) { echo 'matched'; }

文字列「/apple/」は正規表現で、リンゴ文字列がソース文字列に存在するかどうかを照合するために使用されます。

PCRE ライブラリ関数は、PHP で通常のマッチングに使用されます。たとえば、上記の例の preg_match は、通常のマッチングを実行するために使用され、文字パターンの種類が存在するかどうかを判断するためによく使用されます。

正規表現の基本構文

PCRE ライブラリ関数では、正規の一致パターンは区切り文字とメタ文字で構成されます。区切り文字には、数字、バックスラッシュ以外、または非バックスラッシュ以外の任意の文字を使用できます。スペース。一般的に使用される区切り文字は、スラッシュ (/)、ハッシュ記号 (#)、および否定記号 (~) です。例:

/foo bar/ #^[^0-9]$# ~php~

パターンに区切り文字が含まれる場合、区切り文字はバックスラッシュ () エスケープで区切る必要があります。

/http:\/\//

パターンに多くの区切り文字が含まれている場合は、他の文字を区切り文字として使用するか、preg_quote を使用してエスケープすることをお勧めします。

$p = 'http://'; $p = '/'.preg_quote($p, '/').'/'; echo $p;

区切り文字の後にパターン修飾子を使用できます。パターン修飾子には、i、m、s、x などが含まれます。たとえば、i 修飾子を使用すると、大文字と小文字の一致を無視できます。

$str = "Http://www.imooc.com/"; if (preg_match('/http/i', $str)) { echo '匹配成功'; }

メタ文字と変換意味

正規表現で特別な意味を持つ文字は、メタキャラクターと呼ばれます:

一般に、ターゲットの開始位置 (または複数行モード) を主張するために文字
^ をエスケープするために使用されます。 $ ターゲットの終了位置 (または複数行モードの行末) をアサートします
改行を除く任意の文字と一致します (デフォルト)
[開始文字クラス定義
] 終了文字クラス定義
(オプションの分岐を開始します)
サブグループ
) サブグループ
の終了タグ? 0 または 1 の一致を示す量指定子として。量指定子の後に配置して、量指定子の貪欲な性質を変更します。 (数量詞を検索)
* 数量詞、0 個以上一致
+ 数量詞、1 個以上一致
{カスタム数量子開始タグ
} カスタム数量子終了タグ
//下面的\s匹配任意的空白符,包括空格,制表符,换行符。[^\s]代表非空白符。[^\s]+表示一次或多次匹配非空白符。 $p = '/^我[^\s]+(苹果|香蕉)$/'; $str = "我喜欢吃苹果"; if (preg_match($p, $str)) { echo '匹配成功'; }

メタキャラクターには 2 つの使用シナリオがあり、1 つはどこでも使用できます。もう 1 つは角括弧内でのみ使用できます。角括弧内で使用されるものは次のとおりです。

エスケープ文字 ^ は最初の文字としてのみ使用されます (角括弧 (括弧内) は文字クラスの否定を示します
- を示します)文字範囲

ここで、^ は反括弧の外側で、アサーション ターゲットの開始位置を示しますが、角括弧内は文字クラスの否定を表し、角括弧内のマイナスを表します。 数値 - 文字範囲をマークできます。 , たとえば、0-9 は 0 から 9 までのすべての数字を意味します。 //下面的\w匹配字母或数字或下划线。 $p = '/[\w\.\-]+@[a-z0-9\-]+\.(com|cn)/'; $str = "我的邮箱是Spark.eric@imooc.com"; preg_match($p, $str, $match); echo $match[0];

Greedy モードと Lazy モード

+ を使用すると、Greedy になり、できるだけ多くの文字と一致しますが、疑問符 ? の場合、可能な限り少数の文字と一致します。これは遅延モードです。

Greedyモード: 一致する場合と一致しない場合に一致を優先します//下面的\d表示匹配数字 $p = '/\d+\-\d+/'; $str = "我的电话是010-12345678"; preg_match($p, $str, $match); echo $match[0]; //结果为:010-12345678

Lazyモード: 一致する場合と一致しない場合に不一致を優先する$p = '/\d?\-\d?/'; $str = "我的电话是010-12345678"; preg_match($p, $str, $match); echo $match[0]; //结果为:0-1

何が一致するかが正確にわかっている場合 文字の長さ, {} を使用して、一致する文字の数を指定できます$p = '/\d{3}\-\d{8}/'; $str = "我的电话是010-12345678"; preg_match($p, $str, $match); echo $match[0]; //结果为:010-12345678

マッチングには正規表現を使用します

正規表現を使用する目的は、文字列処理関数よりも柔軟性を実現することです。これは文字列処理関数と同じであり、主に部分文字列が存在するかどうかの判断、文字列の置換、文字列の分割、パターン部分文字列の取得などに使用されます。

PHPは、PCREライブラリ関数を使用してパターンを設定し、該当する処理関数を呼び出して一致結果を取得することで通常の処理を実行します。

preg_match は、パターンが正常に一致したかどうかを判断するため、または成功した一致の数 (0 または 1) を取得するために使用され、停止します。 1回検索した後。 $subject = "abcdef"; $pattern = '/def/'; preg_match($pattern, $subject, $matches); print_r($matches); //结果为:Array ( [0] => def )

上記のコードは単純に照合を実行し、def が正常に照合できるかどうかを判断するだけです。ただし、正規表現の威力はパターン マッチングであるため、より多くの場合、パターンが使用されます。正規表現を使用して、より有用なデータを取得します。

查找所有匹配结果

preg_match只能匹配一次结果,但很多时候我们需要匹配所有的结果,preg_match_all可以循环获取一个列表的匹配结果数组。

$p = "|<[^>]+>(.*?)]+>|i"; $str = "example:
this is a test
"; preg_match_all($p, $str, $matches); print_r($matches);

可以使用preg_match_all匹配一个表格中的数据:

$p = "/(.*?)<\/td>\s*(.*?)<\/td>\s*<\/tr>/i"; $str = "
Eric25
John26
"; preg_match_all($p, $str, $matches); print_r($matches);

$matches结果排序为$matches[0]保存完整模式的所有匹配, $matches[1] 保存第一个子组的所有匹配,以此类推。

正则表达式的搜索和替换

正则表达式的搜索与替换在某些方面具有重要用途,比如调整目标字符串的格式,改变目标字符串中匹配字符串的顺序等。

例如我们可以简单的调整字符串的日期格式:

$string = 'April 15, 2014'; $pattern = '/(\w+) (\d+), (\d+)/i'; $replacement = '$3, ${1} $2'; echo preg_replace($pattern, $replacement, $string); //结果为:2014, April 15

其中${1}与$1的写法是等效的,表示第一个匹配的字串,$2代表第二个匹配的。

通过复杂的模式,我们可以更加精确的替换目标字符串的内容。

$patterns = array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/', '/^\s*{(\w+)}\s*=/'); $replace = array ('\3/\4/\1\2', '$\1 =');//\3等效于$3,\4等效于$4,依次类推 echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27'); //结果为:$startDate = 5/27/1999 //详细解释下结果:(19|20)表示取19或者20中任意一个数字,(\d{2})表示两个数字,(\d{1,2})表示1个或2个数字,(\d{1,2})表示1个或2个数字。^\s*{(\w+)\s*=}表示以任意空格开头的,并且包含在{}中的字符,并且以任意空格结尾的,最后有个=号的。

用正则替换来去掉多余的空格与字符:

$str = 'one two'; $str = preg_replace('/\s+/', ' ', $str); echo $str; // 结果改变为'one two'

正则匹配常用案例

正则匹配常用在表单验证上,一些字段会有一定的格式要求,比如用户名一般都要求必须是字母、数字或下划线组成,邮箱、电话等也都有自己的规则,因此使用正则表达式可以很好的对这些字段进行验证。

版权声明:本文为博主原创文章,未经博主允许不得转载。

以上就介绍了php正则表达式,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

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