ホームページ >バックエンド開発 >PHPチュートリアル >PHP 正規表現を使用するためのいくつかのヒント_PHP チュートリアル
PHP 正規表現は主に、文字列のパターン分割、マッチング、検索、置換操作に使用されます。一部の単純な環境では正規表現の使用が効率的でない可能性があるため、PHP 正規表現をより効果的に使用するには、包括的な考慮が必要です
私の PHP 正規表現入門は、インターネット上の記事から始まりました。この記事は、PHP 正規表現の使用方法を浅いところから深いところまで説明していますが、入門書としては十分だと思います。使っているうちに忘れてしまうので、難しい知識については、理解するのに時間がかかることもありますが、できる限りこの記事を 4 ~ 5 回読みました。読んだら、規則を適用する能力が大幅に向上することがわかります。 BKJIA編集者がオススメする『PHP開発基礎入門』
PHP正規表現の定義:
文字の配置とパターンの一致を記述するために使用される文法規則。これは主に、文字列のパターン分割、マッチング、検索、置換操作に使用されます。
PHP の通常の関数:
PHP には 2 つの標準関数のセットがあり、それらの関数は似ており、次のとおりです。
1 つのセットは PCREPerl 互換正規表現) ライブラリによって提供されます。接頭辞「preg_」が付いた名前の関数;Unix の POSIXPortable オペレーティング システム インターフェイスによって提供される拡張機能のセット。接頭辞「ereg_」が付いた名前の関数を使用します。POSIX 通常関数ライブラリは PHP 5.3 以降使用が推奨されなくなり、PHP 6 から削除されます。
POSIX 規則性が歴史の舞台に登場しようとしており、PCRE と perl の形式が似ているため、perl と php の間で切り替える方が便利であるため、ここでは PCRE 規則性の使用に焦点を当てます。
PCRE 正規表現PCRE は Perl Compare Regular Expression の略で、Perl 互換の正規表現を意味します。
PCRE では、パターン式 (正規表現) は通常、「/apple/」のように 2 つのバックスラッシュ「/」の間に含まれます。
正規表現のいくつかの重要な概念には、メタキャラクター、エスケープ、パターン単位の繰り返し、反意語、参照、アサーションが含まれます。これらの概念は、記事 [1] で簡単に理解して習得できます。
よく使用されるメタ文字:メタキャラクターの説明
A は文字列の先頭のアトムと一致しますZ は文字列の末尾のアトムと一致します
b 単語 /bis/ の境界に一致します 先頭が /isb/ である文字列に一致します 末尾が /bisb/ である文字列に一致します 区切り
B 単語の境界を除く任意の文字に一致します /Bis/ 単語「This」の「is」に一致します
d [0-9] に相当する数値と一致します。
D [^0-9] に相当する数字を除く任意の文字と一致します。w [0-9a-zA-Z_] に相当する英語の文字、数字、またはアンダースコアと一致します。
W [^0-9a-zA-Z_] に相当する英語の文字、数字、アンダースコアを除く任意の文字に一致します。
s [ftv] と同等の空白文字に一致します。
S [^ftv] と同等の空白文字を除く任意の文字と一致します。
f x0c または cL と同等のフォーム フィードと一致します
x0a または cJ に相当する改行文字に一致します。
x0d または cM に相当するキャリッジリターンと一致します
t x09 または cl と同等のタブ文字と一致します。
v x0b または ck と同等の垂直タブ文字に一致します。
oNN は 8 進数に一致します
xNN は 16 進数と一致します
cC 制御文字と一致します
パターン修飾子):
パターン修飾子は、大文字と小文字を区別したり、複数の行を一致させたりする場合に特に使用されます。この修飾子をマスターすると、遭遇する多くの問題が解決されることがよくあります。
i - 大文字と小文字の両方に一致します
M - 文字列を複数行として扱いますS - 文字列を単一行として扱い、改行を通常の文字として扱い、「.」を任意の文字と一致させます。
X - パターン内の空白は無視されます
U - 最も近い文字列と一致します
e - 置換された文字列を式として使用します
形式: /apple/i は、大文字と小文字を区別せずに、「apple」または「Apple」などに一致します。 /i
PCREのパターンユニット:
//1 最初の属性を抽出します
/^d{2} ([W])d{2}\1d{4}$ は、「12-31-2006」、「09/27/1996」、「86 01 4321」などの文字列に一致します。しかし、上記の正規表現は「12/34-5678」の形式と一致しません。これは、パターン「[W]」の結果「/」がすでに格納されているためです。次の位置「1」が参照される場合、その一致パターンも文字「/」になります。
当不需要存储匹配结果时使用非存储模式单元“?:)”
例如/(?:a|b|c)(D|E|F)\\1g/ 将匹配“aEEg”。在一些正则表达式中,使用非存储模式单元是必要的。否则,需要改变其后引用的顺序。上例还可以写成/a|b|c)(C|E|F)\2g/。
PCRE正则表达式函数:
<ol class="dp-c"> <li class="alt"><span><span>preg_match()和preg_match_all() </span></span></li> <li class=""><span>preg_quote() </span></li> <li class="alt"><span>preg_split() </span></li> <li class=""><span>preg_grep() </span></li> <li class="alt"><span>preg_replace() </span></li> </ol>
函数的具体使用,我们可以通过PHP手册来找到,下面分享一些平时积累的正则表达式:
匹配action属性
<ol class="dp-c"> <li class="alt"><span><span class="vars"><font color="#dd0000">$str</font></span><span> = </span><span class="string"><font color="#0000ff">'<form></form> <form test.php www.bac.com></form> <form>'</form></font></span><span>; </span></span></li> <li class=""> <span> </span><span class="vars"><font color="#dd0000">$match</font></span><span> = </span><span class="string"><font color="#0000ff">''</font></span><span>; </span> </li> <li class="alt"> <span> preg_match_all(</span><span class="string"><font color="#0000ff">'/\s+action=\"(?!http:)(.*?)\"\s/'</font></span><span>, </span><span class="vars"><font color="#dd0000">$str</font></span><span>, </span><span class="vars"><font color="#dd0000">$match</font></span><span>); </span> </li> <li class=""> <span> print_r(</span><span class="vars"><font color="#dd0000">$match</font></span><span>); </span> </li> </ol>
在正则中使用回调函数
<ol class="dp-c"> <li class="alt"><span><span class="comment"><font color="#008200">/** </font></span> </span></li> <li class=""><span><span class="comment"><font color="#008200"> * replace some string by callback function </font></span> </span></li> <li class="alt"><span><span class="comment"><font color="#008200"> * </font></span> </span></li> <li class=""><span><span class="comment"><font color="#008200"> */</font></span><span> </span></span></li> <li class="alt"> <span> </span><span class="keyword"><strong><font color="#006699">function</font></strong></span><span> callback_replace() { </span> </li> <li class=""> <span> </span><span class="vars"><font color="#dd0000">$url</font></span><span> = </span><span class="string"><font color="#0000ff">'http://esfang.house.sina.com.cn'</font></span><span>; </span> </li> <li class="alt"> <span> </span><span class="vars"><font color="#dd0000">$str</font></span><span> = </span><span class="string"><font color="#0000ff">'<form></form> <form test.php www.bac.com></form> <form>'</form></font></span><span>; </span> </li> <li class=""> <span> </span><span class="vars"><font color="#dd0000">$str</font></span><span> = preg_replace ( </span><span class="string"><font color="#0000ff">'/(?<=\saction=\")(?!http:)(.*?)(?=\"\s)/e'</FONT></SPAN><SPAN>, </SPAN><SPAN class=string><FONT color=#0000ff>'search(\$url, \\1)'</FONT></SPAN><SPAN>, </SPAN><SPAN class=vars><FONT color=#dd0000>$str</FONT></SPAN><SPAN> ); </SPAN></SPAN><LI class=alt><SPAN> </SPAN><LI class=""><SPAN> </SPAN><SPAN class=func>echo</SPAN><SPAN> </SPAN><SPAN class=vars><FONT color=#dd0000>$str</FONT></SPAN><SPAN>; </SPAN></SPAN><LI class=alt><SPAN> } </SPAN><LI class=""><SPAN> </SPAN><LI class=alt><SPAN> </SPAN><SPAN class=keyword><STRONG><FONT color=#006699>function</FONT></STRONG></SPAN><SPAN> search(</SPAN><SPAN class=vars><FONT color=#dd0000>$url</FONT></SPAN><SPAN>, </SPAN><SPAN class=vars><FONT color=#dd0000>$match</FONT></SPAN><SPAN>){ </SPAN></SPAN><LI class=""><SPAN> </SPAN><SPAN class=keyword><STRONG><FONT color=#006699>return</FONT></STRONG></SPAN><SPAN> </SPAN><SPAN class=vars><FONT color=#dd0000>$url</FONT></SPAN><SPAN> . </SPAN><SPAN class=string><FONT color=#0000ff>'/'</FONT></SPAN><SPAN> . </SPAN><SPAN class=vars><FONT color=#dd0000>$match</FONT></SPAN><SPAN>; </SPAN></SPAN><LI class=alt><SPAN> } </SPAN></LI></OL>
带断言的正则匹配
<OL class=dp-c><LI class=alt><SPAN><SPAN class=vars><FONT color=#dd0000>$match</FONT></SPAN><SPAN> = </SPAN><SPAN class=string><FONT color=#0000ff>''</FONT></SPAN><SPAN>; </SPAN></SPAN><LI class=""><SPAN> </SPAN><SPAN class=vars><FONT color=#dd0000>$str</FONT></SPAN><SPAN> = </SPAN><SPAN class=string><FONT color=#0000ff>'xxxxxx.com.cn <B>bold font</B> <p>paragraph text</p>'</FONT></SPAN><SPAN>; </SPAN></SPAN><LI class=alt><SPAN> preg_match_all ( </SPAN><SPAN class=string><FONT color=#0000ff>'/(?<=<(\w{1})>).*(?=<\/\1>)/'</font></span><span>, </span><span class="vars"><font color="#dd0000">$str</font></span><span>, </span><span class="vars"><font color="#dd0000">$match</font></span><span> ); </span> </li> <li class=""> <span> </span><span class="func">echo</span><span> </span><span class="string"><font color="#0000ff">"<br>匹配没有属性的HTML标签中的内容:"</font></span><span>; </span> </li> <li class="alt"> <span> print_r ( </span><span class="vars"><font color="#dd0000">$match</font></span><span> ); </span> </li> </ol>
替换HTML源码中的地址
<ol class="dp-c"><li class="alt"><span><span class="vars"><font color="#dd0000">$form_html</font></span><span> = preg_replace ( </span><span class="string"><font color="#0000ff">'/(?<=\saction=\"|\ssrc=\"|\shref=\")(?!http:|javascript)(.*?)(?=\"\s)/e'</font></span><span>, </span><span class="string"><font color="#0000ff">'add_url(\$url, \'\\1\')'</font></span><span>, </span><span class="vars"><font color="#dd0000">$form_html</font></span><span> ); </span></span></li></ol>
最后,正则工具虽然强大,但是从效率和编写时间上来讲,有的时候可能没有explode来的更直接,对于一些紧急或者要求不高的任务,简单、粗暴的方法也许更好。
而对于preg和ereg两个系列之间的执行效率,曾看到文章说preg要更快一点,具体由于使用ereg的时候并不多,而且也要推出历史舞台了,再加个个人更偏好于PCRE的方式,所以笔者就不做比较了,熟悉的朋友可以发表下意见,谢谢。
本文来自Cocowool的博客园博文《PHP中正则的使用》