PHPの正規表現~PHP TUTORIAL~: PHP入門 :

スポンサーリンク

本当にわからないとこがあった場合一人では解決できません。
『teratail』とはエンジニア特化型のQ&Aサイトです。 すべてのエンジニアさんが抱えている悩みを共有して 解決するための質問サイトです
無料なのでまずは登録して使ってみてください。メールアドレスだけで登録可能です ----------------------------------------------------------------------------------------

3ヶ月10万円で受講できる転職特化型Ruby実践研修【ポテパンキャンプ】

PHPの正規表現

特別なルールで決められた特別な文字の組み合わせを使って実現させる式のことです。

PHPは2セットの正規表現関数に特有の関数を提供しています。それぞれ正規表現の特定の型に対応しています。作成者側で決定ができます。

  • POSIXの正規表現
  • PERLスタイルの正規表現

POSIXの正規表現

POSIX正規表現の構造は、一般的な算術式の構造と異ならない。さまざまな要素(演算子)が結合されてより複雑な式を形成します。

最も単純な正規表現は、g、haggle、bagなどの文字列の中で、gなどの単一の文字と一致するものです。

POSIX正規表現で使用されているいくつかの概念について説明します。その後、正規表現に関連する関数を紹介します。

括弧

角かっこ([])は、正規表現のコンテキストで使用するときに特別な意味を持ちます。彼らは文字の範囲を見つけるために使用されます。

Sr.No 式と説明
1 [0-9]

これは、0から9までの小数の桁にマッチします。

2 [az]

小文字のaから小文字のzまでの任意の文字に一致します。

3 [AZ]

大文字Aから大文字Zまでの任意の文字に一致します。

4 [aZ]

小文字のaから大文字のZまでの任意の文字に一致します。

上記の範囲は一般的です。範囲[0-3]を使用して、0から3までの小数点の桁数に一致させることも、範囲[bv]を使用して、bからvまでの小文字に一致させることもできます。

数量化

括弧で囲まれた文字シーケンスと単一の文字の頻度または位置は、特殊文字で表すことができます。各特殊文字は特定の意味を持つ。+、*、?、{int。range}と$ flagsはすべて文字シーケンスに従います。

Sr.No 式と説明
1 p +

少なくとも1つのpを含む文字列に一致します。

2 p *

0個以上のpを含む文字列にマッチします。

3 p?

0または1のpを含む任意の文字列に一致します。

4 p { N }

それはN pのシーケンスを含む任意の文字列にマッチします

5 p {2,3}

これは、2つまたは3つのpのシーケンスを含む任意の文字列に一致します。

6 p {2、}

少なくとも2つのpのシーケンスを含む文字列にマッチします。

7 p $

それはそれの終わりにpと任意の文字列を一致させます。

8 ^ p

任意の文字列をpの先頭に一致させます。

以下の例は、文字のマッチングに関するあなたの概念をクリアします。

Sr.No 式と説明
1 [^ a-zA-Z]

aからz、AからZまでの文字を含まない文字列と一致します。

2 pp

これは、pを含む文字列に続いて任意の文字にマッチし、続いて別のpが続きます。

3 ^。{2} $

これは、正確に2文字を含む任意の文字列に一致します。

4 <b>(。*)</ b>

<b>と</ b>で囲まれた文字列に一致します。

5 p(hp)*

これは、apを含む任意の文字列に続いて、シーケンスphpの0個以上のインスタンスと一致します。

定義済みの文字範囲

プログラミングの便宜のために、文字クラスとしても知られるいくつかの定義済みの文字範囲が利用可能です。文字クラスは、アルファベットや整数などの文字の全範囲を指定します。

Sr.No 式と説明
1 [[:alpha:]]

アルファベット文字aA〜zZを含む任意の文字列に一致します。

2 [[:digit:]]

0から9の数字の数字を含む文字列と一致します。

3 [[:alnum:]]

英数字aA〜zZおよび0〜9を含む任意の文字列に一致します。

4 [[:space:]]

スペースを含む文字列と一致します。

PHPのRegexp POSIX関数

PHPは現在、POSIXスタイルの正規表現を使用して文字列を検索するための7つの関数を提供しています。

Sr.No
1 ereg()ereg()関数は、stringで指定された文字列を、patternで指定された文字列で検索し、パターンが見つかった場合はtrueを返し、そうでない場合はfalseを返します。

<?php
   $email_id = "admin@sample.com";
   $retval = ereg("(\.)(com$)", $email_id);
   
   if( $retval == true )
   {
      echo "Found a .com<br>";
   }
   else
   {
      echo "Could not found a .com<br>";
   }
	
   $retval = ereg(("(\.)(com$)"), $email_id, $regs);
   
   if( $retval == true )
   {
      echo "Found a .com and reg = ". $regs[0];
   }
   else
   {
      echo "Could not found a .com";
   }
	
?>

こんな感じになる

Found a .com

Found a .com reg = .com

2 ereg_replace()ereg_replace()関数は、patternで指定された文字列を検索し、見つかった場合にはreplacementで置き換えます。

<?php
   $copy_date = "Copyright 1999";
   $copy_date = ereg_replace("([0-9]+)", "2000", $copy_date);
   
   print $copy_date;
?>

このようになる

Copyright 2000

3 eregi()eregi()関数は、patternで指定された文字列の中で、stringで指定された文字列を検索します。大文字と小文字は区別されません。

<?php
   $password = "haha";
   //alnumはアルファベトと数字で構成されてるか調べる
   if (! eregi ("[[:alnum:]]{5,10}", $password))
   {
      print "パスワードが違います! 最低8-10の英数字をしていしてください!";
   }
   else
   {
      print "Valid password";
   }
?>

このようになる

パスワードが違います! 最低8-10の英数字をしていしてください!
4 eregi_replace()eregi_replace()関数は、stringのパターンの検索で大文字と小文字が区別されない点を除いて、ereg_replace()とまったく同じように動作します。

<?php
   $copy_date = "Copyright 2000";
   $copy_date = eregi_replace("([a-z]+)", "&Copy;", $copy_date);
   
   print $copy_date;
?>

 

5 split()split()関数は文字列をさまざまな要素に分割します。文字列内のpatternの出現に基づいて各要素の境界が決まります。

<?php

   $ip = "123.456.789.000"; // some IP address
   $iparr = split ("\.", $ip); 
   
   print "$iparr[0] <br />";
   print "$iparr[1] <br />" ;
   print "$iparr[2] <br />"  ;
   print "$iparr[3] <br />"  ;

?>

こんなふうになる

123

456

789

000

6 spliti()spliti()関数は、大文字と小文字を区別しない点を除いて、sibling split()と変わらない

<?php
   
   $ip = "123.456.789.000"; // some IP address
   $iparr = spliti ("\.", $ip, 3); 
   
   print "$iparr[0] <br />";
   print "$iparr[1] <br />" ;
   print "$iparr[2] <br />"  ;
   print "$iparr[3] <br />"  ;

?>

このようになる

123

456

789000

PERLスタイルの正規表現

Perlスタイルの正規表現は、POSIXの対応する正規表現と似ています。POSIX構文は、Perl形式の正規表現関数とほぼ同じ意味で使用できます。実際には、以前のPOSIXセクションで導入された量指定子のいずれかを使用することができます。

メタ文字

メタ文字は、アルファベット文字の前にバックスラッシュを付けるだけで、組み合わせに特別な意味を与えます。

たとえば、あなたがメタ文字「\ dの」を使用して大規模なお金の合計を検索することができます:/([\ D] +)000 /を、ここで\ dが、数値、文字の任意の文字列を検索します。

以下は、PERLスタイルの正規表現で使用できるメタ文字のリストです。
Character		Description
.              a single character
\s             a whitespace character (space, tab, newline)
\S             non-whitespace character
\d             a digit (0-9)
\D             a non-digit
\w             a word character (a-z, A-Z, 0-9, _)
\W             a non-word character
[aeiou]        matches a single character in the given set
[^aeiou]       matches a single character outside the given set
(foo|bar|baz)  matches any of the alternatives specified

修飾子

大文字と小文字の区別、複数の行の検索など、正規表現での作業をはるかに簡単にするためのいくつかの修飾子が用意されています。

Modifier	Description
i 	Makes the match case insensitive
m 	Specifies that if the string has newline or carriage
	return characters, the ^ and $ operators will now
	match against a newline boundary, instead of a
	string boundary
o 	Evaluates the expression only once
s 	Allows use of . to match a newline character
x 	Allows you to use white space in the expression for clarity
g 	Globally finds all matches
cg 	Allows a search to continue even after a global match fails

PHPのRegexp PERL互換関数

PHPはPerl互換の正規表現を使用して文字列を検索する次の関数を提供しています –

1 preg_match()preg_match()関数は文字列内でpatternを検索し、パターンが存在する場合はtrueを返し、そうでない場合はfalseを返します。

<?php
   $line = "Vi is the greatest word processor ever created!";
   // perform a case-Insensitive search for the word "Vi"
   
   if (preg_match("/\bVi\b/i", $line, $match)) :
      print "Match found!";
      endif;
?>

このようになる

Match found!
2 preg_match_all()preg_match_all()関数は、string内のpatternのすべて一致をするか照合します。

<?php
   $userinfo = "Name: <b>nakamura kengo</b> <br> Title: <b>PHP study</b>";
   preg_match_all ("/<b>(.*)<\/b>/U", $userinfo, $pat_array);
   
   print $pat_array[0][0]." <br> ".$pat_array[0][1]."\n";
?>

これにより、次の結果が生成されます。

nakamura kengo
PHP study
3 preg_replace()preg_replace()関数は、正規表現をパターンおよび置換入力パラメータで使用できる点を除いて、ereg_replace()と同じように動作します。

<?php
   $copy_date = "Copyright 1999";
   $copy_date = preg_replace("([0-9]+)", "2000", $copy_date);
   
   print $copy_date;
?>

これにより、次の結果が生成されます。

Copyright 2000
4 preg_split()preg_split()関数はsplit()と全く同じように動作しますが、正規表現はpatternの入力パラメータとして受け入れられます

<?php
   $ip = "123.456.789.000"; // some IP address
   $iparr = split ("/\./", $ip); 
   
   print "$iparr[0] <br />";
   print "$iparr[1] <br />" ;
   print "$iparr[2] <br />"  ;
   print "$iparr[3] <br />"  ;
?>

123.456.789

5 preg_grep()preg_grep()関数は、input_arrayのすべての要素を検索し、正規表現パターンに一致するすべての要素を返します。

<?php
   $foods = array("pasta", "steak", "fish", "potatoes");
   
   // "p"で始まり、1つ以上の文字が続く要素を見つけます。
   $p_foods = preg_grep("/p(\w+)/", $foods);
   
   print "Found food is " . $p_foods[0];
   print "Found food is " . $p_foods[1];
?>
Found food is pastaFound food is
6 preg_ quote()正規表現文字を引用する

<?php
   $keywords = '$40 for a g3/400';
   $keywords = preg_quote($keywords, '/');
   
   echo $keywords;
?>

こうなる

\$40 for a g3\/400

前のページ①PHP定義済みの変数

次のページ③PHPエラーと例外の処理

スポンサーリンク

プログラミングは独学からは挫折の可能性が高いです。まずは無料体験ができる
コードキャンプが本当におすすめ。無料体験でわからないところを聞きましょう。
転職補助つき。カリキュラム終了後に転職紹介をしてくれます。