ホームページ >バックエンド開発 >PHPチュートリアル >PHP preg_replace() 関数の修飾子と PHP の通常の使用方法の詳細な説明

PHP preg_replace() 関数の修飾子と PHP の通常の使用方法の詳細な説明

WBOY
WBOYオリジナル
2016-06-20 13:03:211115ブラウズ

PHP 正規表現

次の文字を特殊文字、リテラル文字、後方参照、または 8 進エスケープ文字としてマークします。たとえば、「n」は文字「n」と一致します。 「n」は改行文字に一致します。シーケンス "" は "" に一致し、"(" は "(" に一致します。
^ は入力文字列の先頭と一致します。 RegExp オブジェクトの Multiline プロパティが設定されている場合、^ は "n" または "r" の後の位置にも一致します。
$ は入力文字列の末尾と一致します。 RegExp オブジェクトの Multiline プロパティが設定されている場合、$ は "n" または "r" の前の位置にも一致します。
* 直前の部分式と 0 回以上一致します。たとえば、zo* は「z」と「zoo」に一致します。 *{0,} に相当します。
+ 前の部分式と 1 回以上一致します。たとえば、「zo+」は「zo」と「zoo」には一致しますが、「z」には一致しません。 + は {1,} と同等です。
? 直前の部分式と 0 回または 1 回一致します。たとえば、「do(es)?」は「does」または「does」の「do」と一致します。 ? {0,1} に相当します。
{n} n は負ではない整数です。一致が n 回決定されました。たとえば、「o{2}」は「Bob」の「o」とは一致しませんが、「food」の 2 つの o とは一致します。
{n,} n は負ではない整数です。少なくとも n 回一致します。たとえば、「o{2,}」は「Bob」の「o」には一致しませんが、「foooood」のすべての「o」には一致します。 「o{1,}」は「o+」と同等です。 「o{0,}」は「o*」と同等です。
{n,m} m と n は両方とも非負の整数であり、n ? この文字が他の修飾子 (*、+、?、{n}、{n,}、{n,m}) の直後にある場合、一致パターンは非貪欲です。非貪欲モードは検索文字列の可能な限り少ない部分と一致しますが、デフォルトの貪欲モードは検索文字列の可能な限り多くの部分と一致します。たとえば、文字列「oooo」の場合、「o?」は単一の「o」に一致しますが、「o+」はすべての「o」に一致します。
.dot は、「n」を除く任意の 1 文字に一致します。 「n」を含む任意の文字と一致するには、「[sS]」のようなパターンを使用します。
(パターン) パターンと一致し、一致を取得します。取得された一致は、VBScript の SubMatches コレクションと JScript の $0...$9 属性を使用して、生成された Matches コレクションから取得できます。括弧文字と一致させるには、「(」または「)」を使用します。
(?:pattern) はパターンに一致しますが、一致結果は得られません。これは、これは非検索一致であり、後で使用するために保存されないことを意味します。これは、文字「(|)」を使用してパターンの一部を結合する場合に便利です。たとえば、「industr(?:y|ies)」は「industry|industries」よりも単純な式です。
(?=pattern) 正の正の検索。文字列一致パターンの先頭にある検索文字列と一致します。これは非フェッチ一致です。つまり、後で使用するために一致をフェッチする必要はありません。たとえば、「Windows(?=95|98|NT|2000)」は、「Windows2000」の「Windows」と一致しますが、「Windows3.1」の「Windows」と一致することはできません。プリフェッチでは文字は消費されません。つまり、一致が発生した後、次の一致の検索は、プリフェッチを含む文字の後に開始されるのではなく、最後の一致の直後に開始されます。
(?!pattern) 前方否定検索。パターンに一致しない文字列の先頭にある検索文字列と一致します。これは非フェッチ一致です。つまり、後で使用するために一致をフェッチする必要はありません。たとえば、「Windows(?!95|98|NT|2000)」は、「Windows3.1」の「Windows」と一致しますが、「Windows2000」の「Windows」と一致することはできません。
(? (? [xyz] 文字セット。含まれている文字のいずれかと一致します。たとえば、「[abc]」は「plain」の「a」と一致します。
[^xyz] 負の値の文字セット。含まれていない任意の文字と一致します。たとえば、「[^abc]」は「plain」の「plin」と一致します。
[a-z] 文字範囲。指定された範囲内の任意の文字と一致します。たとえば、「[a-z]」は、「a」から「z」までの範囲内の任意の小文字のアルファベット文字に一致します。注: ハイフンが文字グループ内にあり、2 つの文字の間にある場合のみ、文字の範囲を表すことができます。文字グループの先頭にある場合は、ハイフン自体を表すことのみが可能です。 [^a-z] 負の文字範囲。指定された範囲内にない任意の文字と一致します。たとえば、「[^a-z]」は、「a」から「z」の範囲にない任意の文字に一致します。
b は、単語とスペースの間の位置である単語境界に一致します。たとえば、「erb」は「never」の「er」と一致しますが、「verb」の「er」とは一致しません。
B は単語以外の境界に一致します。 「erB」は「動詞」の「er」と一致しますが、「never」の「er」とは一致しません。
cx は、x で指定された制御文字と一致します。たとえば、cM は Control-M または復帰文字と一致します。 x の値は、A ~ Z または a ~ z のいずれかでなければなりません。それ以外の場合は、c をリテラルの「c」文字として扱います。
d は数字と一致します。 [0-9]に相当します。
D は数字以外の文字と一致します。 [^0-9] と同等。
f はフォーム フィード文字と一致します。 x0c および cL に相当します。
n は改行文字と一致します。 x0a および cJ に相当します。
r は復帰文字と一致します。 x0d および cM に相当します。
s は、スペース、タブ、フォーム フィードなどを含む任意の空白文字と一致します。 【fnrtv】に相当。
S は空白以外の文字に一致します。 [^ fnrtv] に相当します。
t はタブ文字と一致します。 x09 および cI に相当します。
v は垂直タブ文字と一致します。 x0b および cK に相当します。
w は、アンダースコアを含む任意の単語文字に一致します。 「[A-Za-z0-9_]」に相当します。
W は単語以外の文字に一致します。 「[^A-Za-z0-9_]」と同等。
xn は n と一致します。n は 16 進数のエスケープ値です。 16 進数のエスケープ値は、正確に 2 桁の長さである必要があります。たとえば、「x41」は「A」と一致します。 「x041」は「x04&1」と同等です。 ASCII エンコーディングは正規表現で使用できます。
num は num と一致します。ここで、num は正の整数です。取得した一致への参照。たとえば、「(.)1」は、連続する 2 つの同一の文字と一致します。
n は、8 進エスケープ値または後方参照を識別します。 n の前に少なくとも n 個のフェッチされた部分式がある場合、n は後方参照になります。それ以外の場合、n が 8 進数 (0 ~ 7) の場合、n は 8 進数のエスケープ値になります。
nm は、8 進エスケープ値または後方参照を識別します。 nm の前に少なくとも nm get 部分式がある場合、nm は後方参照になります。 nm の前に少なくとも n が取得されている場合、n は後方参照であり、その後にリテラル m が続きます。前述の条件がいずれも満たされず、n と m が両方とも 8 進数 (0 ~ 7) である場合、nm は 8 進数のエスケープ値 nm と一致します。
nml n が 8 進数 (0 ~ 7) で、m と l が両方とも 8 進数 (0 ~ 7) の場合、8 進数のエスケープ値 nml と一致します。
un は n と一致します。n は 4 桁の 16 進数で表される Unicode 文字です。たとえば、u00A9 は著作権記号 (©) に一致します。

上記の表は正規表現を比較的包括的に説明したものであり、商標内の正規文字は特別な意味を持ち、元の文字の意味を表すものではなくなります。たとえば、正規表現の「+」はプラス記号を表しませんが、1 回以上の一致を表します。また、「+」でプラス記号を表したい場合は、その前に「」を付けてエスケープする必要があります。つまり、プラス記号を表すには「+」を使用します。

PHP 正規表現区切り文字

ほとんどの言語の正規表現は「/」で区切られますが、PHPでは「/」文字が多数含まれる場合は「/」で区切ることもできます。これらの「/」はエスケープする必要がありますが、「#」を使用するとエスケープする必要がなく、より簡潔になります。

次のようにコードをコピーします:


<?php
$weigeti=&#39;W3CSchool 在线教程的网址是 http://www.scutephp.com/ ,你能把这个网址替换成正确的网址吗?&#39;;
// 上面的要求就是把http://www.scutephp.com/ 替换成 http://www.scutephp.com/w3c/ 
// . : - 都是正则符号,所以需要转义,而 / 是定界符,如果字符串中包含 / 定界符,就需要转义
echo preg_replace(&#39;/http://www.scutephp.com//&#39;,&#39;http://www.scutephp.com/w3c/&#39;,$weigeti);// 在 #作为定界符,/ 就不再是定界符的含义,就不需要转义了。
echo preg_replace(&#39;#http://www.scutephp.com/#&#39;,&#39;http://www.scutephp.com/w3c/&#39;,$weigeti);
//上面两条输出结果都一样,【W3CSchool 在线教程的网址是 http://www.scutephp.com/w3c/ ,你能把这个网址替换成正确的网址吗?】
?>
上記の 2 つの PHP 正規置換コードにより、正規ステートメントに多数の「/」が含まれる場合、区切り文字として「/」または「#」を使用しても問題ありませんが、「#」を使用することがわかります。コードをきれいに見せることができます。ただし、E-Dimension Technology では、JavaScript などの言語では区切り文字として「/」しか使用できないため、区切り文字として「/」を使用し続けることを推奨しています。他の言語。

PHP 正規表現修飾子

修飾子は、PHP 正規表現区切り文字「/」の末尾と正規表現の末尾の引用符の前に配置されます。

次のようにコードをコピーします:


i 忽略大小写,匹配不考虑大小写
m 多行独立匹配,如果字符串不包含[n]等换行符就和普通正则一样。
s 设置正则符号 . 可以匹配换行符[n],如果没有设置,正则符号.不能匹配换行符n。
x 忽略没有转义的空格
e eval() 对匹配后的元素执行函数。
A 前置锚定,约束匹配仅从目标字符串开始搜索
D 锁定$作为结尾,如果没有D,如果字符串包含[n]等换行符,$依旧依旧匹配换行符。如果设置了修饰符m,修饰符D 就会被忽略。
S 对非锚定的匹配进行分析
U 非贪婪,如果在正则字符量词后加&ldquo;?&rdquo;,就可以恢复贪婪
X 打开与perl 不兼容附件
u 强制字符串为UTF-8编码,一般在非UTF-8编码的文档中才需要这个。建议UTF-8环境中不要使用这个
JavaScript の正規表現に詳しい方は、JavaScript の正規表現修飾子「g」に精通しているかもしれません。これは、条件を満たすすべての要素と一致することを意味します。 PHPの通常置換では、すべてのシンボル条件に一致する要素となるため、Javascript修飾子「g」はありません。

PHP 正则中文和忽略大小写PHP preg_replace() 是区分大小写的,同时只能匹配ASCII编码内的字符串,如果需要匹配不区分大小写和中文等字符需要添加相应的修饰符 i 或 u。

复制代码代码如下:
 

<?php
$weigeti=&#39;W3CSchool 在线教程网址:http://www.scutephp.com/w3school/&#39;;
echo preg_replace(&#39;/W3CSchool/&#39;,&#39;w3c&#39;,$weigeti);
//大小写不同,输出【w3c 在线教程网址:http://www.scutephp.com/w3school/】
echo preg_replace(&#39;/W3CSchool/i&#39;,&#39;w3c&#39;,$weigeti);
//忽略大小写,执行替换输出【w3c 在线教程网址:http://www.scutephp.com/w3c/】
echo preg_replace(&#39;/网址/u&#39;,&#39;&#39;,$weigeti);
//强制 UTF-8中文,执行替换,输出【W3CSchool 在线教程:http://www.scutephp.com/w3school/】
?>

大小写和中文在PHP中都是敏感的,但是在Javascript正则中,只对大小写敏感,忽略大小写也是通过修饰符 i 作用的,但是Javascript 不需要告知是否是UTF-8中文等特殊字符,直接可以匹配中文。

PHP 正则换行符实例

PHP 正则表达式在遇到换行符时,会将换行符当做字符串中间一个普通字符。而通用符号.不能匹配n,所以遇到带有换行符的字符串正则会有很多要点。

复制代码代码如下:
 

<?php
$weigeti="scutephp.comnISnLOVINGnYOU";

// 想要把上面$weigeti 替换成scutephp.com

echo preg_replace(&#39;/^[A-Z].*[A-Z]$/&#39;,&#39;&#39;,$weigeti);
// 这个正则表达式是,匹配只包含w的元素,$weigeti 是以V开头,符合[A-Z],而且结尾是U,也符合[A-Z]。.无法匹配n
// 输出【jb51.net IS LOVEING YOU】

echo preg_replace(&#39;/^[A-Z].*[A-Z]$/s&#39;,&#39;&#39;,$weigeti);
// 这个用修饰符s,也就是 . 可以匹配 n 了,所以整句匹配,输出空
// 输出【】

echo preg_replace(&#39;/^[A-Z].*[A-Z]$/m&#39;,&#39;&#39;,$weigeti);
// 这里使用了修饰符,将n作为多行独立匹配。也就等价于:
/* 
$preg_m=preg_replace(&#39;/^[A-Z].*[A-Z]$/m&#39;,&#39;&#39;,$weigeti);

$p=&#39;/^[A-Z].*[A-Z]$/&#39;;
$a=preg_replace($p,&#39;&#39;,&#39;
scutephp.com&#39;);
$b=preg_replace($p,&#39;&#39;,&#39;IS&#39;);
$c=preg_replace($p,&#39;&#39;,&#39;LOVING&#39;);
$d=preg_replace($p,&#39;&#39;,&#39;YOU&#39;);

$preg_m === $a.$b.$c.$d;
*/
// 输出【scutephp.com】
?>

以后您在使用PHP 抓取某个网站内容,并用正则批量替换的时候,总无法避免忽略获取的内容包含换行符,所以在使用正则替换的时候一定要注意。

PHP 正则匹配执行函数PHP 正则替换可以使用一个修饰符e,代表 eval() 来执行匹配后的内容某个函数。

复制代码代码如下:
 

<?php
$weigeti=&#39;W3CSchool 在线教程网址:http://www.scutephp.com ,你Jbzj!了吗?&#39;;
// 将上面网址转为小写
echo preg_replace(&#39;/(http:[/w.-]+/)/e&#39;,&#39;strtolower("$1")&#39;,$weigeti);
// 使用修饰符e之后,就可以对匹配的网址执行PHP 函数 strtolower() 了
// 输出 【W3CSchool 在线教程网址:http://www.scutephp.com ,你Jbzj!了吗?】
?>

根据上面代码,尽管匹配后的函数 strtolower() 在引号内,但是依旧会被eval()执行。

正则替换匹配变量向后引用

如果您熟悉Javascript,一定对$1 $2 $3 …… 等向后引用比较熟悉,而在 PHP 中这些也可以被当作向后引用参数。而在PHP中,还可以使用 1 1 来表示向后引用。

向后引用的概念就是匹配一个大片段,这个正则表达式内部又被用括号切割成若干小匹配元素,那么每个匹配元素就被按照小括号序列用向后引用代替。

复制代码代码如下:
 

<?php
$weigeti=&#39;W3CSchool 在线教程网址:http://www.scutephp.com ,你Jbzj!了吗?&#39;;

echo preg_replace(&#39;/.+(http:[w-/.]+/)[^w-!]+([w-!]+).+/&#39;,&#39;$1&#39;,$weigeti);
echo preg_replace(&#39;/.+(http:[w-/.]+/)[^w-!]+([w-!]+).+/&#39;,&#39;1&#39;,$weigeti);
echo preg_replace(&#39;/.+(http:[w-/.]+/)[^w-!]+([w-!]+).+/&#39;,&#39;1&#39;,$weigeti);
// 上面三个都是输出 【http://www.scutephp.com】

echo preg_replace(&#39;/^(.+)网址:(http:[w-/.]+/)[^w-!]+([w-!]+).+$/&#39;,&#39;栏目:$1<br>网址:$2<br>商标:$3&#39;,$weigeti);

// 括号中括号,外面括号先计数
echo preg_replace(&#39;/^((.+)网址:(http:[w-/.]+/)[^w-!]+([w-!]+).+)$/&#39;,&#39;原文:$1<br>栏目:$2<br>网址:$3<br>商标:$4&#39;,$weigeti);
?>

 


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