Maison  >  Article  >  développement back-end  >  Comment implémenter du contenu de remplacement régulier en php

Comment implémenter du contenu de remplacement régulier en php

藏色散人
藏色散人original
2021-03-02 09:23:382375parcourir

Comment implémenter un remplacement de contenu régulier en PHP : créez d'abord un exemple de fichier PHP ; puis définissez un ensemble de chaînes et enfin transmettez "preg_replace('/http://www....com/_blog/ ; /' ...)" une expression régulière peut remplacer le contenu.

Comment implémenter du contenu de remplacement régulier en php

L'environnement d'exploitation de cet article : système Windows 7, PHP version 7.1, ordinateur Dell G3.

Fonction PHP preg_replace() remplacement régulier de toutes les chaînes qualifiées

Remplacement régulier PHP preg_replace(), différent du remplacement régulier JavaScript, PHP preg_replace() La valeur par défaut est de remplacer tous les éléments qui correspondent à la condition .

preg_replace (正则表达式, 替换成, 字符串, 最大替换次数【默认-1,无数次】, 替换次数)

Les expressions régulières dans la plupart des langues sont similaires, mais il existe également des différences subtiles.

Expression régulière PHP

+ Correspond à la sous-expression précédente zéro ou une fois. Par exemple, "do(es)?" dans « fait ». ? équivaut à {0,1}.           "o{2}" ne peut pas correspondre au "o" dans "Bob", cependant. Peut correspondre à deux o dans "food". entier. Par exemple, "o{. 2,}" ne peut pas correspondre au "o" dans "Bob", mais il peut correspondre à tous les o dans "foooood". o{0,}" est équivalent à "o*". m et n sont tous deux des entiers non négatifs, où n< =m correspond à au moins n fois. Par exemple, "o{1,3}" correspondra aux trois premiers o de "fooooood". Notez la virgule et les deux chiffres. Il ne peut y avoir d'espaces entre lorsque ce caractère est suivi d'un autre limiteur (*,+,?,{ n},{n, }, {n,m}), le mode de correspondance est non gourmand. Le mode non gourmand correspond le moins possible à la chaîne recherchée, tandis que le mode gourmand par défaut correspond à la plus grande partie de la chaîne recherchée. autant que possible. Par exemple, pour la chaîne "oooo", "o?" correspondra à un seul "o", tandis que "o+" correspondra à tous les "o" correspondent. N'importe quel caractère sauf "n". Pour faire correspondre n'importe quel caractère incluant "n", utilisez un modèle comme "[sS]"(?:pattern)(?=motif) Recherche positive positive Recherche négative directe, correspond à la chaîne de recherche au début de toute chaîne qui ne correspond pas au modèle. Il s'agit d'une correspondance sans récupération, c'est-à-dire qu'il n'est pas nécessaire de récupérer la correspondance pour une utilisation ultérieure. Par exemple, « Windows(?!95|98|NT|2000) » peut correspondre à « Windows » dans « Windows3.1 », mais ne peut pas correspondre à « Windows » dans « Windows2000 ». Pré-vérification positive inverséeAperçu négatif inversé correspond à x ou y. Par exemple, « z|food » correspond à « z » ou « food ». "(z|f)ood" correspond à "zood" ou "food". <.> [^a-z]Plage de caractères négative. Correspond à tout caractère ne se trouvant pas dans la plage spécifiée. Par exemple, "[^a-z]" correspond à tout caractère qui n'est pas compris entre "a" et "z". b correspond à une limite de mot, qui fait référence à la position entre un mot et un espace. Par exemple, « erb » peut correspondre au « er » dans « never » mais pas au « er » dans « verb ». B correspond aux limites autres que les mots. "erB" correspond au "er" dans "verb", mais pas au "er" dans "jamais". cx correspond au caractère de contrôle spécifié par x. Par exemple, cM correspond à un caractère Control-M ou à un retour chariot. La valeur de x doit être A-Z ou a-z. Sinon, traitez c comme un caractère « c » littéral. d correspond à un caractère numérique. Équivalent à [0-9]. D correspond à un caractère non numérique. Équivalent à [^0-9]. f correspond à un saut de formulaire. Équivalent à x0c et cL. n correspond à un caractère de nouvelle ligne. Équivalent à x0a et cJ. r correspond à un caractère de retour chariot. Équivalent à x0d et cM. s correspond à n'importe quel caractère d'espacement, y compris les espaces, les sauts de ligne, les tabulations, les sauts de formulaire, les espaces chinois pleine largeur, etc. Équivalent à [frntv]. S correspond à tout caractère autre qu'un espace. Équivalent à [^ frntv]. t correspond à un caractère de tabulation. Équivalent à x09 et cI. v correspond à un caractère de tabulation verticale. Équivalent à x0b et cK. w correspond à n'importe quel caractère de mot, y compris un trait de soulignement. Équivalent à "[A-Za-z0-9_]". W correspond à n'importe quel caractère autre qu'un mot. Équivalent à "[^A-Za-z0-9_]". xn correspond à n, où n est la valeur d'échappement hexadécimale. La valeur d’échappement hexadécimale doit comporter exactement deux chiffres. Par exemple, « x41 » correspond à « A ». "x041" équivaut à "x04&1". Le codage ASCII peut être utilisé dans les expressions régulières. num correspond à num, où num est un entier positif. Une référence au match obtenu. Par exemple, "(.)1" correspond à deux caractères identiques consécutifs. n identifie une valeur d'échappement octale ou une référence arrière. n est une référence vers l'arrière si n est précédé d'au moins n sous-expressions récupérées. Sinon, si n est un nombre octal (0-7), alors n est une valeur d'échappement octale. nmIdentifie une valeur d'échappement octale ou une référence arrière. Si nm est précédé d'au moins nm get sous-expressions, nm est une référence vers l'arrière. Si nm est précédé d'au moins n, alors n est une référence vers l'arrière suivie du littéral m. Si aucune des conditions précédentes n'est remplie et si n et m sont tous deux des nombres octaux (0-7), nm correspondra à la valeur d'échappement octale nm. nmlSi n est un nombre octal (0-7) et m et l sont tous deux des nombres octaux (0-7), faites correspondre la valeur d'échappement octale nml. un correspond à n, où n est un caractère Unicode représenté par quatre chiffres hexadécimaux. Par exemple, u00A9 correspond au symbole de droit d'auteur (©).

上表是正则表达式比较全面的解释,而商标中的正则字符都有特殊含义,已经不再代表原字符含义。如正则表达式中“+”不代表加号,而是代表匹配一次或多次。而如果想要让“+”表示加号,则需要在其前面加上“\”转义,也就是用“\+”表示加号。

【推荐学习:《PHP视频教程》】

1+1=2  正则表达式是: 1\+1=2
而正则表达式 1+1=2 可以代表,多个1=2,即:
11=2     正则表达式:1+1=2
111=2    正则表达式:1+1=2
1111=2   正则表达式:1+1=2
……

也就是说所有正则字符都有特定含义,如果需要再用来表示原字符含义,就需要在前面加“\”转义,即使非正则字符,用“\”转义也是没有问题的。

1+1=2  正则表达式也可以是: \1\+\1\=\2
对所有字符都转义,但是这种不建议使用。 

而正则表达式必须要使用定界符包围起来,在JavaScript中定界符是“/”,而在PHP中,比较常见的是用“/”定界,也可以用“#”定界,而且外面还需要用引号包围起来。

如果正则表达式包含这些定界符,您就需要对这些字符进行转义。

 

PHP 正则表达式定界符

大多数语言的正则表达式都是由“/”作为定界符的,而在PHP中,还可以使用“#”定界,如果字符串中包含大量“/”字符,在使用“/”定界的时候,就需要对这些“/”转义,而使用“#”就不需要转义,更简洁。

<?php
$subject=&#39;钱运来PHP博客的网址是 http://blog.snsgou.com/_blog/ ,你能把这个网址替换成正确的网址吗?&#39;;

// 上面的要求就是把 http://blog.snsgou.com/_blog 替换成 http://blog.snsgou.com/

// . : - 都是正则符号,所以需要转义,而 / 是定界符,如果字符串中包含 / 定界符,就需要转义

echo preg_replace(&#39;/http\:\/\/www\.qianyunlai\.com\/\_blog\//&#39;, &#39;http://blog.snsgou.com/&#39;, $subject);

echo &#39;<br />&#39;;

// 在 #作为定界符,/ 就不再是定界符的含义,就不需要转义了。
echo preg_replace(&#39;#http\://www\.qianyunlai\.com/\_blog/#&#39;, &#39;http://blog.snsgou.com/&#39;, $subject);

// 上面两条输出结果都一样,【钱运来PHP博客的网址是 http://blog.snsgou.com/,你能把这个网址替换成正确的网址吗?】

?>

通过上面的两条PHP 正则替换代码我们可以发现,如果正则语句中包含大量“/”,无论使用“/” 还是 “#”做定界符都是可以的,但是使用“#”能让代码看起来更简洁。但还是建议您保持使用“/”作为定界符,因为在JavaScript等语言中,只能使用“/”作为定界符,这样写起来可以形成习惯,贯通于其他语言中。

PHP 正则表达式修饰符

修饰符被放在PHP正则表达式定界符“/”之后,在正则表达式尾部引号之前。

i 忽略大小写,匹配不考虑大小写

m 多行独立匹配,如果字符串不包含[\n]等换行符就和普通正则一样。

s 设置正则符号 . 可以匹配换行符[\n],如果没有设置,正则符号.不能匹配换行符\n。

x 忽略没有转义的空格

eval() 对匹配后的元素执行函数。

A 前置锚定,约束匹配仅从目标字符串开始搜索

D 锁定$作为结尾,如果没有D,如果字符串包含[\n]等换行符,$依旧依旧匹配换行符。如果设置了修饰符m,修饰符D 就会被忽略。

S 对非锚定的匹配进行分析

U 非贪婪,如果在正则字符量词后加“?”,就可以恢复贪婪

X 打开与perl 不兼容附件

u 强制字符串为UTF-8编码,一般在非UTF-8编码的文档中才需要这个。建议UTF-8环境中不要使用这个。

如果您熟悉JavaScript 的正则表达式,或许一定熟悉JavaScript 正则表达式的修饰符“g”,代表匹配所有符合条件的元素。而在PHP 正则替换中,是匹配所有符号条件的元素,所以不存在JavaScript 修饰符“g”。

PHP 正则中文和忽略大小写

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

<?php
$subject=&#39;钱运来PHP博客网址:http://www.QIanyunlai.com/&#39;;

// 大小写不同,输出【钱运来PHP博客网址:http://www.QIanyunlai.com/】
echo preg_replace(&#39;/QIAN/&#39;, &#39;qian&#39;, $subject);
echo &#39;<br />&#39;;

// 忽略大小写,执行替换输出【钱运来PHP博客网址:http://blog.snsgou.com/】
echo preg_replace(&#39;/QIAN/i&#39;, &#39;qian&#39;, $subject);
echo &#39;<br />&#39;;

// 强制 UTF-8中文,执行替换,输出【钱运来PHP博客:http://www.QIanyunlai.com/】
echo preg_replace(&#39;/网址/u&#39;, &#39;&#39;, $subject);
?>

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

PHP 正则换行符实例

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

<?php
$subject="snsgou.com\nIS\nLOVING\nYOU";

// 想要把上面$subject 替换成snsgou.com

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

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

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

$p = &#39;/^[A-Z].*[A-Z]$/&#39;;
$a = preg_replace($p, &#39;&#39;, &#39;snsgou.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;
*/
// 输出【snsgou.com】
?>

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

PHP 正则匹配执行函数

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

<?php
$subject=&#39;钱运来PHP博客网址:http://www.qianYUNlai.com/&#39;;

// 将上面网址转为小写

echo preg_replace(&#39;/(http\:[\/\w\.\-]+\/)/e&#39;, &#39;strtolower("$1")&#39;, $subject);
// 使用修饰符e之后,就可以对匹配的网址执行PHP 函数 strtolower() 了
// 输出 【钱运来PHP博客网址:http://blog.snsgou.com/】
?>

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

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

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

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

<?php
$subject=&#39;钱运来PHP博客网址:http://blog.snsgou.com/,你yun-lai了吗?&#39;;

echo preg_replace(&#39;/.+(http\:[\w\-\/\.]+\/)[^\w\-\!]+([\w\-\!]+).+/&#39;, &#39;$1&#39;, $subject);
echo preg_replace(&#39;/.+(http\:[\w\-\/\.]+\/)[^\w\-\!]+([\w\-\!]+).+/&#39;, &#39;\1&#39;, $subject);
echo preg_replace(&#39;/.+(http\:[\w\-\/\.]+\/)[^\w\-\!]+([\w\-\!]+).+/&#39;, &#39;\\1&#39;, $subject); // 通常用这个
echo &#39;<br />&#39;;
// 上面三个都是输出 【http://blog.snsgou.com/】

echo preg_replace(&#39;/^(.+)网址:(http\:[\w\-\/\.]+\/)[^\w\-\!]+([\w\-\!]+).+$/&#39;, &#39;栏目:$1<br>网址:$2<br>商标:$3&#39;, $subject);
/*
栏目:钱运来PHP博客
网址:http://blog.snsgou.com/
商标:yun-lai
*/
echo &#39;<br />&#39;;

// 括号中括号,外面括号先计数
echo preg_replace(&#39;/^((.+)网址:(http\:[\w\-\/\.]+\/)[^\w\-\!]+([\w\-\!]+).+)$/&#39;, &#39;原文:$1<br>栏目:$2<br>网址:$3<br>商标:$4&#39;, $subject);
/*
原文:钱运来PHP博客网址:http://blog.snsgou.com/,你yun-lai了吗?
栏目:钱运来PHP博客
网址:http://blog.snsgou.com/
商标:yun-lai
*/
?>

 

Caractères réguliers Explication régulière
Marquer le caractère suivant comme caractère spécial, Ou un caractère littéral, une référence arrière ou un caractère d'échappement octal. Par exemple, « n » correspond au caractère « n ». "\n" correspond à un caractère de nouvelle ligne. La séquence "\" correspond à "" et "(" correspond à "(".
^ correspond au début de la chaîne d'entrée. Si l'objet RegExp est défini Attribut multiligne, ^ correspond également à la position après "n" ou "r"
$ correspond à la position de fin de la chaîne d'entrée s'il est défini. correspond également à la position avant "n" ou "r".
* correspond à la sous-expression précédente zéro ou plusieurs fois zo* peut correspondre à "z" et ". zoo". *Équivalent à {0,}
correspond à la sous-expression précédente une ou plusieurs fois. . Par exemple, "zo+" peut correspondre à "zo" mais pas à "z". + est équivalent à {1,} ?
{n,m>
?
. Les points
(motif)<.> Faites correspondre le modèle et obtenez cette correspondance. La correspondance obtenue peut être obtenue à partir de la collection Matches générée, en utilisant la collection SubMatches dans VBScript et l'attribut $0...$9 dans JScript. Pour faire correspondre les caractères entre parenthèses, utilisez "(" ou ")".
correspond au modèle mais n'obtient pas le résultat correspondant, ce qui signifie qu'il s'agit d'une correspondance non obtenue et n'est pas stockée pour une utilisation ultérieure. Ceci est utile lors de la combinaison de parties d'un motif à l'aide du caractère ou "(|)". Par exemple, « industr(?:y|ies) » est une expression plus simple que « industry|industries ».
, correspond à la chaîne de recherche au début de tout modèle de correspondance de chaîne. Il s'agit d'une correspondance sans récupération, c'est-à-dire qu'il n'est pas nécessaire de récupérer la correspondance pour une utilisation ultérieure. Par exemple, « Windows(?=95|98|NT|2000) » peut correspondre à « Windows » dans « Windows2000 », mais ne peut pas correspondre à « Windows » dans « Windows3.1 ». La prélecture ne consomme pas de caractères, c'est-à-dire qu'après une correspondance, la recherche de la correspondance suivante commence immédiatement après la dernière correspondance, plutôt qu'après le caractère contenant la prélecture.
(?!modèle)
(?<=motif)
, similaire à la pré-vérification positive avant, mais dans le sens opposé . Par exemple, "(?<=95|98|NT|2000)Windows" peut correspondre à "Windows" dans "2000Windows", mais ne peut pas correspondre à "Windows" dans "3.1Windows". (?
, similaire à l'aperçu négatif direct, mais dans la direction opposée. Par exemple, "(? x|y
[xyz] jeu de caractères. Correspond à l'un des caractères contenus. Par exemple, « [abc] » correspondrait au « a » dans « plain ».
[^xyz] Un ensemble de caractères de valeur négative. Correspond à n’importe quel caractère non inclus. Par exemple, "[^abc]" correspondrait à "plin" dans "plain".
[a-z] plage de caractères. Correspond à n’importe quel caractère dans la plage spécifiée. Par exemple, "[a-z]" correspond à n'importe quel caractère alphabétique minuscule compris entre "a" et "z". Remarque : Ce n'est que lorsque le trait d'union se trouve à l'intérieur du groupe de caractères et entre deux caractères qu'il peut représenter la plage de caractères ; s'il apparaît au début du groupe de caractères, il ne peut représenter que le trait d'union lui-même

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn