次の文字を特殊文字、リテラル文字、後方参照、または 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 は著作権記号 (©) に一致します。
PHP 正規表現区切り文字
次のようにコードをコピーします:
<?php $weigeti='W3CSchool 在线教程的网址是 http://www.scutephp.com/ ,你能把这个网址替换成正确的网址吗?'; // 上面的要求就是把http://www.scutephp.com/ 替换成 http://www.scutephp.com/w3c/ // . : - 都是正则符号,所以需要转义,而 / 是定界符,如果字符串中包含 / 定界符,就需要转义 echo preg_replace('/http://www.scutephp.com//','http://www.scutephp.com/w3c/',$weigeti);// 在 #作为定界符,/ 就不再是定界符的含义,就不需要转义了。 echo preg_replace('#http://www.scutephp.com/#','http://www.scutephp.com/w3c/',$weigeti); //上面两条输出结果都一样,【W3CSchool 在线教程的网址是 http://www.scutephp.com/w3c/ ,你能把这个网址替换成正确的网址吗?】 ?>
PHP 正規表現修飾子
次のようにコードをコピーします:
i 忽略大小写,匹配不考虑大小写 m 多行独立匹配,如果字符串不包含[n]等换行符就和普通正则一样。 s 设置正则符号 . 可以匹配换行符[n],如果没有设置,正则符号.不能匹配换行符n。 x 忽略没有转义的空格 e eval() 对匹配后的元素执行函数。 A 前置锚定,约束匹配仅从目标字符串开始搜索 D 锁定$作为结尾,如果没有D,如果字符串包含[n]等换行符,$依旧依旧匹配换行符。如果设置了修饰符m,修饰符D 就会被忽略。 S 对非锚定的匹配进行分析 U 非贪婪,如果在正则字符量词后加“?”,就可以恢复贪婪 X 打开与perl 不兼容附件 u 强制字符串为UTF-8编码,一般在非UTF-8编码的文档中才需要这个。建议UTF-8环境中不要使用这个
PHP 正则中文和忽略大小写PHP preg_replace() 是区分大小写的,同时只能匹配ASCII编码内的字符串,如果需要匹配不区分大小写和中文等字符需要添加相应的修饰符 i 或 u。
复制代码代码如下:
<?php $weigeti='W3CSchool 在线教程网址:http://www.scutephp.com/w3school/'; echo preg_replace('/W3CSchool/','w3c',$weigeti); //大小写不同,输出【w3c 在线教程网址:http://www.scutephp.com/w3school/】 echo preg_replace('/W3CSchool/i','w3c',$weigeti); //忽略大小写,执行替换输出【w3c 在线教程网址:http://www.scutephp.com/w3c/】 echo preg_replace('/网址/u','',$weigeti); //强制 UTF-8中文,执行替换,输出【W3CSchool 在线教程:http://www.scutephp.com/w3school/】 ?>
大小写和中文在PHP中都是敏感的,但是在Javascript正则中,只对大小写敏感,忽略大小写也是通过修饰符 i 作用的,但是Javascript 不需要告知是否是UTF-8中文等特殊字符,直接可以匹配中文。
PHP 正则表达式在遇到换行符时,会将换行符当做字符串中间一个普通字符。而通用符号.不能匹配n,所以遇到带有换行符的字符串正则会有很多要点。
复制代码代码如下:
<?php $weigeti="scutephp.comnISnLOVINGnYOU"; // 想要把上面$weigeti 替换成scutephp.com echo preg_replace('/^[A-Z].*[A-Z]$/','',$weigeti); // 这个正则表达式是,匹配只包含w的元素,$weigeti 是以V开头,符合[A-Z],而且结尾是U,也符合[A-Z]。.无法匹配n // 输出【jb51.net IS LOVEING YOU】 echo preg_replace('/^[A-Z].*[A-Z]$/s','',$weigeti); // 这个用修饰符s,也就是 . 可以匹配 n 了,所以整句匹配,输出空 // 输出【】 echo preg_replace('/^[A-Z].*[A-Z]$/m','',$weigeti); // 这里使用了修饰符,将n作为多行独立匹配。也就等价于: /* $preg_m=preg_replace('/^[A-Z].*[A-Z]$/m','',$weigeti); $p='/^[A-Z].*[A-Z]$/'; $a=preg_replace($p,'',' scutephp.com'); $b=preg_replace($p,'','IS'); $c=preg_replace($p,'','LOVING'); $d=preg_replace($p,'','YOU'); $preg_m === $a.$b.$c.$d; */ // 输出【scutephp.com】 ?>
以后您在使用PHP 抓取某个网站内容,并用正则批量替换的时候,总无法避免忽略获取的内容包含换行符,所以在使用正则替换的时候一定要注意。
PHP 正则匹配执行函数PHP 正则替换可以使用一个修饰符e,代表 eval() 来执行匹配后的内容某个函数。
复制代码代码如下:
<?php $weigeti='W3CSchool 在线教程网址:http://www.scutephp.com ,你Jbzj!了吗?'; // 将上面网址转为小写 echo preg_replace('/(http:[/w.-]+/)/e','strtolower("$1")',$weigeti); // 使用修饰符e之后,就可以对匹配的网址执行PHP 函数 strtolower() 了 // 输出 【W3CSchool 在线教程网址:http://www.scutephp.com ,你Jbzj!了吗?】 ?>
根据上面代码,尽管匹配后的函数 strtolower() 在引号内,但是依旧会被eval()执行。
如果您熟悉Javascript,一定对$1 $2 $3 …… 等向后引用比较熟悉,而在 PHP 中这些也可以被当作向后引用参数。而在PHP中,还可以使用 1 1 来表示向后引用。
向后引用的概念就是匹配一个大片段,这个正则表达式内部又被用括号切割成若干小匹配元素,那么每个匹配元素就被按照小括号序列用向后引用代替。
复制代码代码如下:
<?php $weigeti='W3CSchool 在线教程网址:http://www.scutephp.com ,你Jbzj!了吗?'; echo preg_replace('/.+(http:[w-/.]+/)[^w-!]+([w-!]+).+/','$1',$weigeti); echo preg_replace('/.+(http:[w-/.]+/)[^w-!]+([w-!]+).+/','1',$weigeti); echo preg_replace('/.+(http:[w-/.]+/)[^w-!]+([w-!]+).+/','1',$weigeti); // 上面三个都是输出 【http://www.scutephp.com】 echo preg_replace('/^(.+)网址:(http:[w-/.]+/)[^w-!]+([w-!]+).+$/','栏目:$1<br>网址:$2<br>商标:$3',$weigeti); // 括号中括号,外面括号先计数 echo preg_replace('/^((.+)网址:(http:[w-/.]+/)[^w-!]+([w-!]+).+)$/','原文:$1<br>栏目:$2<br>网址:$3<br>商标:$4',$weigeti); ?>