ホームページ >バックエンド開発 >PHPチュートリアル >posix と perl の標準正規表現の違いを解析する_PHP チュートリアル
正则表达式(Regular Expression,缩写为regexp,regex或regxp),又称正规表达式、正规表示式或常规表达式或正规化表示法或正规表示法,是指一个用 来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本 内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的在正则表达式引擎。正则表达式这个概念最初是由 Unix中的工具软件(例如sed和grep)普及开的。(摘自维基百科)
PHP同时使用两套正则表达式规则,一套是由电气和电子工程师 协会(IEEE)制定的POSIX Extended 1003.2兼容正则(事实上PHP对此标准的支持并不完善),另一套来自PCRE(Perl Compatible Regular Expression)库提供PERL兼容正则,这是个开放源代码的软件,作者为 Philip Hazel。
使用POSIX兼容规则的函数有:
ereg_replace()
ereg()
eregi()
eregi_replace()
split()
spliti()
sql_regcase()
mb_ereg_match()
mb_ereg_replace()
mb_ereg_search_getpos()
mb_ereg_search_getregs()
mb_ereg_search_init()
mb_ereg_search_pos()
mb_ereg_search_regs()
mb_ereg_search_setpos()
mb_ereg_search()
mb_ereg()
mb_eregi_replace()
mb_eregi()
mb_regex_encoding()
mb_regex_set_options()
mb_split()
使用PERL兼容规则的函数有:
preg_grep()
preg_replace_callback()
preg_match_all()
preg_match()
preg_quote()
preg_split()
preg_replace()
定界符:
POSIX兼容正则没有定界符,函数的相应参数会被认为是正则。
PERL兼容正则可以使用任何不是字母、数字或反斜线(\)的字符作为定界符,如果作为定界符的字符必须被用在表达式本身中,则需要用反斜线转义。也可以使用(),{},[] 和 <> 作为定界符
修正符:
POSIX兼容正则没有修正符。
PERL兼容正则中可能使用的修正符(修正符中的空格和换行被忽略,其它字符会导致错误):
i (PCRE_CASELESS):
匹配时忽略大小写。
m(PCRE_MULTILINE):
当设定了此修正符,行起始(^)和行结束($)除了匹配整个字符串开头和结束外,还分别匹配其中的换行符(\n)的之后和之前。
s(PCRE_DOTALL):
如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。
x(PCRE_EXTENDED):
如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略。
e:
如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。 只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。
A(PCRE_ANCHORED):
如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。
D(PCRE_DOLLAR_ENDONLY):
如果设定了此修正符,模式中的行结束($)仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,也会被匹配在里面。如果设定了 m 修正符则忽略此选项。
S:
当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。
U(PCRE_UNGREEDY):
使“?”的默认匹配成为贪婪状态的。
X(PCRE_EXTRA):
模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。
u(PCRE_UTF8):
模式字符串被当成UTF-8。
逻辑区隔:
POSIX兼容正则和PERL兼容正则的逻辑区隔符号作用和使用方法完全一致:
[]:包含任选一操作的相关信息。
{}:包含匹配次数的相关信息。
():包含一个逻辑区间的相关信息,可被用来进行引用操作。
|:表示“或”,[ab]和a|b是等价的。
「[]」に関連するメタキャラクター:
メタキャラクターには 2 つの異なるセットがあります。1 つは角括弧を除くパターン内で認識され、もう 1 つは角括弧 "[]" 内で認識されます。
POSIX 互換の通常および PERL 互換の通常の "[]" および "一貫した" メタ文字:
いくつかの用途がある汎用エスケープ文字
^ 文字列の先頭と一致します
$ 文字列の末尾と一致します
?または 1
* 前に指定したタイプの 0 文字以上の文字と一致
+ 前に指定したタイプの 1 つ以上の文字と一致
POSIX 互換正規表現と PERL 互換正規表現 "[] 以外" の「一貫性のない」メタ文字:
PERL 互換正規表現は、改行文字を除く任意の文字に一致します
POSIX 互換正規表現は、任意の文字に一致します
POSIX 互換の正規表現および PERL 互換の正規表現 「[] 内」の「一貫した」メタ文字:
複数の用途があるユニバーサルエスケープ文字
^ 文字を否定しますが、それが最初の文字である場合のみ 有効
- 文字 ASCII を指定しますASCII コードを注意深く調べると、[W-c] が [WXYZ\^_`abc] と同等であることがわかります
POSIX 互換の正規表現と PERL 互換の正規表現「[]」内に「一貫性のない」メタ文字があります:
- POSIX 互換の正規表現で [a-c-e] を指定すると、エラーがスローされます。
- PERL 互換の正規表現における [a-c-e] の指定は、[a-e] と同等です。
一致の数は「{}」に関連しています:
POSIX 互換の正規表現と PERL 互換の正規表現は、一致時間の点ではまったく同じです:
{2}: 前の文字 2 と一致することを意味します回
{2,}: 前の文字と 2 回以上一致することを意味します。デフォルトは貪欲 (可能な限り) 一致します
{2,4}: 前の文字と 2 回または 4 回一致することを意味します
論理間隔は「()」に関連しています:
()で囲まれた領域は論理間隔です。論理間隔の主な機能は、いくつかの文字が出現する論理順序を反映することです。引用に使用できます(この範囲内の値を変数に参照できます)。後者の関数はかなり奇妙です:
$str = "http://www.163.com/";
// POSIX 互換の正規:
echo ereg_replace("(.+)","< a href = \1 >\1",$str);
// PERL 互換の正規:
echo preg_replace("/(.+)/","$1< ; /a>",$str);
// 2 つのリンクを表示します
?>
引用する場合、括弧は入れ子にすることができ、論理的な順序は「(」の出現順序に従って調整されます。
型一致:
POSIX 互換正規:
[:upper:]: すべての大文字と一致 [: lower:]: すべての小文字と一致
[:alpha:]: すべての文字と一致
[: alnum:]: すべての文字と数字に一致します
[:digit:]: すべての数字に一致します
[:xdigit:]: [0-9A-Fa-f] に相当するすべての 16 進文字に一致します
[:punct:]: に一致しますすべての句読点、[.,"'?!;:] と同等
[:blank:]: スペースおよび TAB と一致、[t] と同等
[:space :]: すべての空白文字と一致、[tnrfv] と同等
[:cntrl:]: ASCII 0 から 31 までのすべての制御文字と一致します。
[:graph:]: すべての印刷可能な文字と一致します。 In: [^ tnrfv]
[:print:]: すべての印刷可能な文字とスペースと一致します。以下と同等: [^tnrfv]
[.c.]: 未知の関数
[=c=]: 未知の関数
[ :<:]: 単語の先頭と一致
[:>:]: 末尾と一致一言
PERL 互換正規表現 (ここで PERL 正規表現の威力を確認できます):
アラーム、つまり BEL 文字 ('0) cx "control-x"、x は任意の文字
eエスケープ ( '0B)
f フォームフィード ('0C)
n 改行 ('0A)
r キャリッジリターン ('0D)
t タブ ('0)
xhh 16 進数コードは hh 文字
ddd 8 進数コードが ddd である文字、またはバックリファレンス
d 任意の 10 進数
D 任意の 10 進数以外の文字
s 任意の空白文字
S 任意の非空白文字
w 任意の「単語」文字
W 任意の「非単語」文字
b 単語境界
B 非単語境界
A ターゲットの始まり (複数行モードから独立)
Z ターゲットの終わりまたは終了改行の前 (複数行モードから独立) )
z ターゲットの終わり (複数行モードから独立)
G ターゲット内で最初に一致する位置