Heim  >  Artikel  >  Backend-Entwicklung  >  Informationen zur Methode von preg_replace() in PHP zum regelmäßigen Ersetzen aller Zeichenfolgen, die die Bedingungen erfüllen

Informationen zur Methode von preg_replace() in PHP zum regelmäßigen Ersetzen aller Zeichenfolgen, die die Bedingungen erfüllen

不言
不言Original
2018-06-21 14:25:462514Durchsuche

In diesem Artikel wird hauptsächlich die preg_replace()-Methode zum regelmäßigen Ersetzen aller qualifizierten Zeichenfolgen in PHP vorgestellt. Sie hat einen bestimmten Referenzwert. Jetzt können Freunde in Not darauf verweisen.

PHP preg_replace () Die reguläre Ersetzung unterscheidet sich von der regulären Javascript-Ersetzung. PHP preg_replace() ersetzt standardmäßig alle Elemente, deren Symbole den Bedingungen entsprechen

Die Daten, die wir mit Programmen verarbeiten müssen, werden nicht immer im Voraus mit Datenbankdenken entworfen. Mit anderen Worten: Es kann nicht über die Datenbankstruktur gespeichert werden.
Zum Beispiel Parsing-Vorlagen der Template-Engine, Filterung sensibler Spam-Informationen usw.
Im Allgemeinen verwenden wir in diesem Fall reguläre Ausdrücke, um preg_match abzugleichen und preg_replace gemäß unseren Regeln zu ersetzen.
Aber in allgemeinen Anwendungen sind sie nichts anderes als Datenbank-CRUD, und es gibt nur sehr wenige Möglichkeiten, mit regulären Ausdrücken herumzuspielen.
Nach dem, was zuvor gesagt wurde, gibt es zwei Szenarien: statistische Analyse mit Matching-Verarbeitung und Ersetzung.

PHP preg_replace() reguläre Ersetzung. Im Gegensatz zur regulären Javascript-Ersetzung ersetzt PHP preg_replace() standardmäßig alle Elemente, deren Symbole den Bedingungen entsprechen.

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

Reguläre Ausdrücke sind in den meisten Sprachen ähnlich, es gibt jedoch auch subtile Unterschiede.

PHP Regulärer Ausdruck

+{n}{n,m}?(Muster) Muster abgleichen und diese Übereinstimmung abrufen. Die erhaltene Übereinstimmung kann aus der generierten Matches-Sammlung mithilfe der SubMatches-Sammlung in VBScript und dem Attribut $0...$9 in JScript abgerufen werden. Um Klammerzeichen zuzuordnen, verwenden Sie „(“ oder „)“. stimmt mit dem Muster überein, erhält aber nicht das passende Ergebnis, was bedeutet, dass es sich um eine nicht erhaltende Übereinstimmung handelt und nicht für die spätere Verwendung gespeichert wird. Dies ist nützlich, wenn Sie Teile eines Musters mit dem oder-Zeichen „(|)“ kombinieren. Beispielsweise ist „industr(?:y|ies)“ ein einfacherer Ausdruck als „industry|industries“. Positive positive Suche, Übereinstimmung mit der Suchzeichenfolge am Anfang eines beliebigen Zeichenfolgenübereinstimmungsmusters. Dies ist eine Nicht-Abruf-Übereinstimmung, d. h. die Übereinstimmung muss nicht zur späteren Verwendung abgerufen werden. Beispielsweise kann „Windows(?=95|98|NT|2000)“ mit „Windows“ in „Windows2000“ übereinstimmen, aber nicht mit „Windows“ in „Windows3.1“. Beim Vorabruf werden keine Zeichen verbraucht, d. h. nach einer Übereinstimmung beginnt die Suche nach der nächsten Übereinstimmung unmittelbar nach der letzten Übereinstimmung und nicht nach dem Zeichen, das den Vorabruf enthält. Vorwärtsnegative Suche, wobei die Suchzeichenfolge am Anfang jeder Zeichenfolge abgeglichen wird, die nicht mit dem Muster übereinstimmt. Dies ist eine Nicht-Abruf-Übereinstimmung, d. h. die Übereinstimmung muss nicht zur späteren Verwendung abgerufen werden. Beispielsweise kann „Windows(?!95|98|NT|2000)“ mit „Windows“ in „Windows3.1“ übereinstimmen, aber nicht mit „Windows“ in „Windows2000“. Die umgekehrte positive Vorprüfung ähnelt der vorwärts gerichteten positiven Vorprüfung, jedoch in die entgegengesetzte Richtung. Beispielsweise kann „(?<=95|98|NT|2000)Windows“ mit „Windows“ in „2000Windows“ übereinstimmen, aber nicht mit „Windows“ in „3.1Windows“. Die umgekehrte negative Vorschau ähnelt der vorwärts gerichteten negativen Vorschau, jedoch in die entgegengesetzte Richtung. Beispielsweise kann „(? entspricht x oder y. Beispielsweise entspricht „z|food“ „z“ oder „food“. „(z|f)ood“ entspricht „zood“ oder „food“. Zeichensatz. Entspricht einem der enthaltenen Zeichen. Beispielsweise würde „[abc]“ mit dem „a“ in „plain“ übereinstimmen.[^a-z]Negativzeichenbereich. Entspricht jedem Zeichen, das nicht im angegebenen Bereich liegt. „[^a-z]“ entspricht beispielsweise jedem Zeichen, das nicht im Bereich „a“ bis „z“ liegt. b entspricht einer Wortgrenze, die sich auf die Position zwischen einem Wort und einem Leerzeichen bezieht. Beispielsweise kann „erb“ mit „er“ in „never“ übereinstimmen, aber nicht mit „er“ in „verb“. B entspricht Nicht-Wortgrenzen. „erB“ kann mit dem „er“ in „verb“ übereinstimmen, aber nicht mit dem „er“ in „never“. cx entspricht dem durch x angegebenen Steuerzeichen. Beispielsweise entspricht cM einem Strg-M- oder Wagenrücklaufzeichen. Der Wert von x muss A-Z oder a-z sein. Andernfalls behandeln Sie c als wörtliches „c“-Zeichen. d entspricht einem numerischen Zeichen. Entspricht [0-9]. D entspricht einem nicht numerischen Zeichen. Entspricht [^0-9]. f entspricht einem Formular-Feed. Entspricht x0c und cL. n entspricht einem Zeilenumbruchzeichen. Entspricht x0a und cJ. r entspricht einem Wagenrücklaufzeichen. Entspricht x0d und cM. s entspricht jedem Leerzeichen, einschließlich Leerzeichen, Tabulatoren, Formularvorschüben usw. Entspricht [fnrtv]. S entspricht jedem Zeichen, das kein Leerzeichen ist. Entspricht [^ fnrtv]. t entspricht einem Tabulatorzeichen. Entspricht x09 und cI. v entspricht einem vertikalen Tabulatorzeichen. Entspricht x0b und cK. w entspricht jedem Wortzeichen, einschließlich eines Unterstrichs. Entspricht „[A-Za-z0-9_]“. W entspricht jedem Nicht-Wort-Zeichen. Entspricht „[^A-Za-z0-9_]“. xn entspricht n, wobei n der hexadezimale Escape-Wert ist. Der hexadezimale Escape-Wert muss genau zwei Ziffern lang sein. Beispielsweise entspricht „x41“ „A“. „x041“ entspricht „x04&1“. Die ASCII-Kodierung kann in regulären Ausdrücken verwendet werden. num stimmt mit num überein, wobei num eine positive ganze Zahl ist. Ein Verweis auf die erhaltene Übereinstimmung. „(.)1“ entspricht beispielsweise zwei aufeinanderfolgenden identischen Zeichen. n identifiziert einen oktalen Escape-Wert oder eine Rückreferenz. n ist eine Rückwärtsreferenz, wenn vor n mindestens n abgerufene Unterausdrücke stehen. Andernfalls, wenn n eine Oktalzahl (0-7) ist, dann ist n ein oktaler Escape-Wert. nmIdentifiziert einen oktalen Escape-Wert oder eine Rückreferenz. Wenn vor nm mindestens nm get-Unterausdrücke stehen, handelt es sich bei nm um eine Rückwärtsreferenz. Wenn vor nm mindestens n steht, dann ist n eine Rückwärtsreferenz, gefolgt vom Literal m. Wenn keine der vorherigen Bedingungen erfüllt ist und n und m beide Oktalzahlen (0-7) sind, stimmt nm mit dem oktalen Escape-Wert nm überein. nmlWenn n eine Oktalzahl (0-7) ist und m und l beide Oktalzahlen (0-7) sind, stimmen Sie mit dem oktalen Escape-Wert überein nml. un entspricht n, wobei n ein Unicode-Zeichen ist, das durch vier Hexadezimalziffern dargestellt wird. Beispielsweise entspricht u00A9 dem Copyright-Symbol (©).

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

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
$weigeti=&#39;W3CSchool 在线教程的网址是 http://e.jb51.net/ ,你能把这个网址替换成正确的网址吗?&#39;;
// 上面的要求就是把http://e.jb51.net/ 替换成 http://e.jb51.net/w3c/ 
// . : - 都是正则符号,所以需要转义,而 / 是定界符,如果字符串中包含 / 定界符,就需要转义
echo preg_replace(&#39;/http\:\/\/www\.jb51\.net\//&#39;,&#39;http://e.jb51.net/w3c/&#39;,$weigeti);
// 在 #作为定界符,/ 就不再是定界符的含义,就不需要转义了。
echo preg_replace(&#39;#http\://www\.jb51\.net/#&#39;,&#39;http://e.jb51.net/w3c/&#39;,$weigeti);
//上面两条输出结果都一样,【W3CSchool 在线教程的网址是 http://e.jb51.net/w3c/ ,你能把这个网址替换成正确的网址吗?】
?>

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

PHP 正则表达式修饰符

修饰符被放在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环境中不要使用这个,据E维科技调查使用这个会有一个Bug。

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

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

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

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

PHP 正则换行符实例

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

<?php
$weigeti="php.cn\nIS\nLOVING\nYOU";
// 想要把上面$weigeti 替换成php.cn
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;php.cn&#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;
*/
// 输出【php.cn】
?>

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

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

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

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

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

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

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

<?php
$weigeti=&#39;W3CSchool 在线教程网址://www.jb51.net ,你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);
// 上面三个都是输出 【//www.jb51.net】
echo preg_replace(&#39;/^(.+)网址:(http\:[\w\-\/\.]+\/)[^\w\-\!]+([\w\-\!]+).+$/&#39;,&#39;栏目:$1<br>网址:$2<br>商标:$3&#39;,$weigeti);
/*
栏目:W3CSchool 在线教程
网址://www.jb51.net
商标:Jbzj!
*/
// 括号中括号,外面括号先计数
echo preg_replace(&#39;/^((.+)网址:(http\:[\w\-\/\.]+\/)[^\w\-\!]+([\w\-\!]+).+)$/&#39;,&#39;原文:$1<br>栏目:$2<br>网址:$3<br>商标:$4&#39;,$weigeti);
/*
原文:W3CSchool 在线教程网址://www.jb51.net ,你Jbzj!了吗?
栏目:W3CSchool 在线教程
网址://www.jb51.net
商标:Jbzj!
*/
?>

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于php中str_replace替换漏洞的分析

如何通过php获取随机数组列表

Regelmäßige Zeichen Regelmäßige Erklärung
Markieren Sie das nächste Zeichen als Sonderzeichen, oder ein Literalzeichen, ein Rückverweis oder ein oktales Escape-Zeichen. Beispielsweise entspricht „n“ dem Zeichen „n“. „\n“ entspricht einem Zeilenumbruchzeichen. Die Sequenz „\“ entspricht „“ und „(“ entspricht „(“.
^ entspricht dem Anfang der Eingabezeichenfolge. Wenn das RegExp-Objekt festgelegt ist Das mehrzeilige Attribut ^ entspricht auch der Position nach „n“ oder „r“
$ entspricht der Endposition der Eingabezeichenfolge, sofern festgelegt Entspricht auch der Position vor „n“ oder „r“. zoo". *Entspricht {0,}
stimmt ein oder mehrere Male mit dem vorherigen Unterausdruck überein. . Beispielsweise kann „zo+“ mit „zo“ übereinstimmen, aber nicht mit „z“ . + ist äquivalent zu {1,} Entspricht dem vorhergehenden Unterausdruck null oder einmal. in „tut“. ? ist äquivalent zu {0,1} 🎜>
n ist eine nicht negative ganze Zahl, die beispielsweise eine bestimmte Anzahl an Übereinstimmungen aufweist: „o{2}“ kann nicht mit dem „o“ in „Bob“ übereinstimmen, kann jedoch mit zwei o in „food“ übereinstimmen „o{. 2,}“ kann beispielsweise nicht mit dem „o“ in „Bob“ übereinstimmen, aber es kann mit allen „o“ in „foooood“ übereinstimmen. o{0,}“ ist äquivalent zu „o*“.
m und n sind beide nicht negative ganze Zahlen, wobei n< =m stimmt mindestens n-mal überein. Beispielsweise entspricht „o{1,3}“ den ersten drei o in „foooood“. Beachten Sie das Komma und die beiden Zahlen. Zwischen
dürfen keine Leerzeichen stehen, wenn auf dieses Zeichen ein anderer Begrenzer (*,+,?,{) folgt. n},{n, }, {n,m}), der Übereinstimmungsmodus ist nicht gierig. Der nicht gierige Modus entspricht so wenig wie möglich von der gesuchten Zeichenfolge, während der standardmäßige gierige Modus so viel wie möglich von der gesuchten Zeichenfolge übereinstimmt Für die Zeichenfolge „oooo“ wird beispielsweise „o?“ mit einem einzelnen „o“ übereinstimmen, während „o+“ mit allen „o“s übereinstimmt. Punkte passen zu jedem einzelnen Zeichen außer „n“. Verwenden Sie ein Muster wie „[sS]“
(?:pattern)
(?=pattern)
(?!pattern)
(?<=pattern)
(?
x|y
[xyz]
[^xyz] Eine Reihe von Zeichen mit negativem Wert. Entspricht jedem Zeichen, das nicht enthalten ist. Beispielsweise würde „[^abc]“ mit „plin“ in „plain“ übereinstimmen.
[a-z] Zeichenbereich. Entspricht jedem Zeichen innerhalb des angegebenen Bereichs. „[a-z]“ entspricht beispielsweise jedem Kleinbuchstaben im Bereich „a“ bis „z“. Hinweis: Nur wenn der Bindestrich innerhalb der Zeichengruppe und zwischen zwei Zeichen steht, kann er den Zeichenbereich darstellen; wenn er am Anfang der Zeichengruppe steht, kann er nur den Bindestrich selbst darstellen 🎜>

Das obige ist der detaillierte Inhalt vonInformationen zur Methode von preg_replace() in PHP zum regelmäßigen Ersetzen aller Zeichenfolgen, die die Bedingungen erfüllen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn