Heim >Backend-Entwicklung >PHP-Tutorial >Reguläre Beziehungen in PHP

Reguläre Beziehungen in PHP

不言
不言Original
2018-04-23 13:55:081582Durchsuche

Der Inhalt dieses Artikels handelt von der regulären Beziehung in PHP, die jetzt einen gewissen Referenzwert hat. Freunde in Not können sich darauf beziehen

Übersicht

Regulärer Ausdruck ist eine grammatikalische Regel, die das Ergebnis einer Zeichenfolge beschreibt. Es handelt sich um ein spezifisches Formatierungsmuster, das übereinstimmende Zeichenfolgen abgleichen, ersetzen und abfangen kann. Häufig verwendete Sprachen verfügen grundsätzlich über reguläre Ausdrücke wie JavaScript, Java usw. Solange Sie den regulären Gebrauch einer Sprache verstehen, ist es tatsächlich relativ einfach, die regulären Regeln anderer Sprachen zu verwenden. Der Text konzentriert sich hauptsächlich auf die Lösung der folgenden Probleme.

  • Was sind die am häufigsten verwendeten Escapezeichen?

  • Was sind Qualifizierer und Locators?

  • Was sind Wortsucher

  • Was sind die Sonderzeichen

  • Was sind Rückverweise und wie werden Rückverweise verwendet?

  • Übereinstimmungsmuster

  • Wie man reguläre Ausdrücke in PHP verwendet

  • Welche Aspekte von PHP müssen reguläre Ausdrücke verwenden

  • So führen Sie einen E-Mail-Abgleich, einen URL-Abgleich und einen Mobiltelefon-Abgleich durch

  • So verwenden Sie reguläre Ausdrücke, um bestimmte Zeichen in einer Zeichenfolge zu ersetzen

  • Der Unterschied zwischen Greedy Matching und Lazy Matching

  • Backtracking und solide Gruppierung regulärer Ausdrücke

  • Was sind die Vor- und Nachteile von regulären Ausdrücken

Zusammenfassung der Grundkenntnisse regulärer Ausdrücke

Zeilensucher (^ und $)

Zeilensucher werden verwendet, um die Grenzen von zu beschreiben Saiten. “$” stellt das Ende der Zeile dar. “^” stellt den Anfang der Zeile dar. Beispielsweise stellt "^de" eine Zeichenfolge dar, die mit de endet. "de$"

Worttrennzeichen

Wenn wir nach einem Wort suchen, z. B. ob ein in einer Zeichenfolge „gril und body“ vorhanden ist, ist es offensichtlich, dass bei einer Übereinstimmung ein definitiv in Ordnung ist. Die Übereinstimmung Die Zeichenfolge „gril and body“ stimmt überein. Wie können wir dafür sorgen, dass sie mit Wörtern und nicht mit Wortteilen übereinstimmt? Zu diesem Zeitpunkt können wir ein Worttrennzeichen b sein.

Wenn banb mit „gril and body“ übereinstimmt, wird eine Meldung angezeigt, dass keine Übereinstimmung möglich ist.
Natürlich gibt es ein großes B, was genau das Gegenteil von b bedeutet. Die entsprechende Zeichenfolge kann kein vollständiges Wort sein, sondern ein Teil anderer Wörter oder Zeichenfolgen. Wie BanB.

Wählen Sie das Zeichen (|) aus, das dargestellt werden soll, oder

Wählen Sie das Zeichen aus, das dargestellt werden soll, oder. Aa|aA bedeutet beispielsweise Aa oder aA. Beachten Sie, dass der Unterschied zwischen der Verwendung von „[]“ und „|“ darin besteht, dass „[]“ nur mit einem einzelnen Zeichen übereinstimmen kann, während „|“ mit einer Zeichenfolge beliebiger Länge übereinstimmen kann. Bei der Verwendung von „[]“ wird es häufig zusammen mit dem Verbindungszeichen „-“ verwendet, z. B. [a-d], das a oder b oder c oder d darstellt.

Zeichen ausschließen, Operationen ausschließen

Reguläre Ausdrücke stellen „^“ bereit, um nicht übereinstimmende Zeichen auszuschließen. ^ wird im Allgemeinen in [] platziert. Beispiel: [^1-5], dieses Zeichen ist keine Zahl zwischen 1 und 5.

Qualifier (?*+{n, m})

Qualifier wird hauptsächlich verwendet, um die Anzahl des Vorkommens jeder Zeichenfolge zu begrenzen.

限定字符 含义
零次或一次
* 零次或多次
+ 一次或多次
{n} n次
{n,} 至少n次
{n,m} n到m次
Zum Beispiel steht (D+) für ein oder mehrere D

Der Punktoperator

entspricht jedem Zeichen (außer Zeilenumbrüchen)

Backslashes in Ausdrücke (

)

Backslashes in Ausdrücken haben mehrere Bedeutungen, z. B. Escapezeichen, Angabe eines vordefinierten Zeichensatzes, Definition von Behauptungen und Anzeige nicht druckbarer Zeichen.

Escape-Zeichen

Escape-Zeichen wandeln hauptsächlich einige Sonderzeichen in normale Zeichen um. Zu diesen häufig verwendeten Sonderzeichen gehören „.“, „?“, „“ usw.

Geben Sie einen vordefinierten Zeichensatz an

字符 含义
d 任意一个十进制数字[0-9]
D 任意一个非十进制数字
s 任意一个空白字符(空格、换行符、换页符、回车符、字表符)
S 任意一个非空白字符
w 任意一个单词字符
W 任意个非单词字符
###Nicht druckbare Zeichen anzeigen

Klammerzeichen ()

Die Hauptfunktionen von Klammern in regulären Ausdrücken sind:

  • Ändern Sie den Umfang von Qualifikationsmerkmalen wie (|, *, ^)
    Wenn beispielsweise (mein|dein)baby kein „()“ vorhanden ist, entspricht | entweder „mein“ oder „dein“ Baby.

  • ist gruppiert, um Rückverweise zu erleichtern

Rückverweise

Rückverweise basieren auf Unterausdrücken Das „Gedächtnis“ Die Funktion gleicht aufeinanderfolgende Zeichenfolgen oder Zeichen ab. Beispielsweise bedeutet (dqs)(pps)12, dass die Zeichenfolge dqsppsdqspps gefunden wird. In der folgenden PHP-Anwendung werde ich ausführlich über Rückverweise lernen.

Mustermodifikator

Die Rolle des Mustermodifikators besteht darin, das Muster festzulegen, d. h. wie der reguläre Ausdruck interpretiert wird. Die Hauptmodi in PHP sind wie folgt:

修饰符 说明
i 忽略大小写
m 多文本模式
s 单行文本模式
x 忽略空白字符

Anwenden regulärer Ausdrücke in PHP

String-Matching in PHP

Der sogenannte String-Matching besteht darin, festzustellen, ob ein String einen anderen String enthält oder diesem gleich ist. Wenn wir keine regulären Ausdrücke verwenden, können wir viele in PHP bereitgestellte Methoden verwenden, um solche Urteile zu fällen.

Verwendet kein reguläres Matching

  • strstr-Funktion
    string strstr ( string h aystack,mixeNadel [ , bool $before_needle = false ])

    • Hinweis 1: h a ystack ist , wenn DingeCharakterCharakterString, Nadel ist das Charakterwesen nach Zeichenfolge gesucht. Bei dieser Funktion wird die Groß-/Kleinschreibung beachtet.

    • Hinweis 2: Der Rückgabewert gilt vom Anfang bis zum Ende der Nadel.

    • Hinweis 3: Wenn es sich bei $needle nicht um eine Zeichenfolge handelt, wird sie als Ganzzahl behandelt und als Sequenznummer des Zeichens verwendet.

    • Hinweis 4: Wenn before_needle wahr ist, geben Sie das vorherige zurück.

  • Die strstr-Funktion ist die gleiche wie die strstr-Funktion, außer dass die Groß-/Kleinschreibung nicht beachtet wird

  • strpo-Funktion
    int strpos ( string haystack, mixedneedle [, int $offset = 0 ] )
    Hinweis 1: Der optionale Offset-Parameter kann verwendet werden, um anzugeben, welches Zeichen im Heuhaufen verwendet werden soll Beginnen Sie mit der Suche. Die zurückgegebene numerische Position ist relativ zur Startposition des Heuhaufens.

  • stripos – Finden Sie die Position, an der zum ersten Mal in der Zeichenfolge erscheint ( ist nicht größenabhängig)

  • strrpos – Berechnet die Position des letzten Vorkommens von in der Zielzeichenfolge

  • strripos – Berechnet die Position der angegebenen Zeichenfolge in der Zielzeichenfolge Das letzte Vorkommen von (Groß-/Kleinschreibung wird nicht beachtet)

Verwenden Sie reguläre Ausdrücke für den Abgleich

In PHP, preg_math( ) und preg_match_all-Funktion für reguläres Matching. Die Prototypen dieser beiden Funktionen lauten wie folgt:

int preg_match|preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

Suchen Sie nach einer Übereinstimmung zwischen Betreff und dem durch Muster angegebenen regulären Ausdruck.
Muster: Zu suchendes Muster, Zeichenfolgentyp.
Betreff: Eingabezeichenfolge.
Übereinstimmungen: Wenn der Parameter Übereinstimmungen angegeben wird, wird er als Suchergebnisse ausgefüllt. matches[0]wirdPaketeinschließlichkomplettkomplettModellFormStückpassendzusTextdieser, Übereinstimmungen[1] enthalten das erste Capture-Sub Gruppieren Sie übereinstimmenden Text und so weiter.
Flags: Flags können auf die folgenden Flag-Werte gesetzt werden: PREG_OFFSET_CAPTURE Wenn dieses Flag übergeben wird, wird der String-Offset (relativ zum Ziel-String) für jedes Vorkommen einer Übereinstimmung zurückgegeben. Hinweis: Dadurch wird das im Parameter „Matches“ ausgefüllte Array geändert, sodass jedes Element zu einer Zeichenfolge wird, wobei das 0. Element die übereinstimmende Zeichenfolge und das 1. Element der Offset der übereinstimmenden Zeichenfolge im Zielzeichenfolgensubjekt ist.
Offset: Normalerweise beginnt die Suche am Anfang der Zielzeichenfolge. Der optionale Parameter offset wird verwendet, um die Suche ab einem unbekannten Punkt in der Zielzeichenfolge anzugeben (Einheit ist Bytes).
Rückgabewert: preg_match() gibt die Anzahl der Übereinstimmungen für Muster zurück. Sein Wert ist 0 (keine Übereinstimmung) oder 1, da preg_match() die Suche nach der ersten Übereinstimmung beendet. preg_match_all() unterscheidet sich davon, es durchsucht das Thema, bis es das Ende erreicht. Wenn ein Fehler auftritt, gibt preg_match() FALSE zurück.

Beispiel

  • Beispiel 1
    Richterzeichenfolge" http://blog.csdn . net/hsd2012“ enthält csdn?
    Lösung 1 (reguläre Regeln sind nicht anwendbar):
    Wenn reguläre Regeln nicht anwendbar sind, können wir entweder strstr oder strpos verwenden. Hier werde ich die strstr-Funktion verwenden, Code wie folgt :

$str='http://blog.csdn.net/hsd2012';function checkStr1($str,$str2)
{    return strstr1($str,$str2)?true:false;
}echo checkStr($str,'csdn');

Lösung 2: Reguläre Ausdrücke verwenden
Da wir nur feststellen müssen, ob es existiert, wählen wir preg_match.

$str='http://blog.csdn.net/hsd2012';$pattern='/csdn/';function checkStr2($str,$str2)
{    return preg_match($str2,$str)?true:false;
}echo checkStr2($str,$pattern);
  • Beispiel 2 (Überprüfung des Worttrennzeichens)
    Bestimmen Sie, ob die Zeichenfolge „Ich bin ein guter Junge“ das Wort „go“ enthält
    Stellen Sie zunächst fest, dass es sich um ein Wort und nicht um eine Zeichenfolge handelt. Beim Vergleich müssen Sie also vergleichen, ob es „go“ enthält, dh ob vor und nach der Zeichenfolge „go“ ein Leerzeichen steht.
    Analyse: Wenn Sie einen nicht regulären Vergleich verwenden, müssen Sie nur die obige Funktion checkStr1() aufrufen. Beachten Sie, dass vor und nach dem zweiten Parameter, also „go“, ein Leerzeichen eingefügt werden muss. Wenn Sie reguläre Ausdrücke verwenden,
    können wir in Betracht ziehen, das Worttrennzeichen b zu verwenden, dann $pattern='/bgob/' und dann die Funktion checkStr2 aufzurufen

  • Beispiel 3 (Inspektion Rückverweis)
    Bestimmen Sie, ob die Zeichenfolge „Ich bin ein guter Junge“ 3 identische Buchstaben enthält
    Analyse: Wenn wir zu diesem Zeitpunkt keine regulären Ausdrücke verwenden, wird es schwierig zu beurteilen sein Da es zu viele Buchstaben gibt, ist es für uns unmöglich, alle Buchstaben mit der jeweiligen Zeichenfolge zu vergleichen, was ebenfalls viel Arbeit erfordern würde. Dieses Mal handelt es sich um aktuelle Rückverweise. In regulären PHP-Ausdrücken wird n verwendet, um das Ergebnis der n-ten Übereinstimmung darzustellen. Beispielsweise stellt 5 das fünfte Übereinstimmungsergebnis dar. Das Wichtigste zu $pattern='/(w).*1.*1/';
    in dieser Frage ist also, dass Sie beim Rückwärtsabgleich () verwenden müssen, um die Zeichen oder Zeichenfolgen abzugleichen, die in () erscheinen.

String-Ersetzung in PHP

Verwendet keine regulären Ausdrücke

Wenn beim Ersetzen von Strings in PHP keine regulären Ausdrücke anwendbar sind, verwenden wir normalerweise Substr , mb_substr, str_replace und substr_replace. Die Unterschiede zwischen diesen Funktionen sind wie folgt.

函数符 功能 描述
str_replace(find,replace,string,count) 使用一个字符串替换字符串中的另一些字符。 find 必需。规定要查找的值。replace 必需。规定替换 find 中的值的值。string 必需。规定被搜索的字符串。count 可选。一个变量,对替换数进行计数。
substr_replace(string,replacement,start,length) 把字符串的一部分替换为另一个字符串。适合用于替换自定位置的字符串。 string 必需。规定要检查的字符串。replacement 必需。规定要插入的字符串。start 必需。规定在字符串的何处开始替换。

Verwenden Sie reguläre Ausdrücke

Wenn Sie die Ersetzung durch reguläre Ausdrücke verwenden, stellt PHP die Funktionen preg_replace _callback und preg_replace bereit. Der Prototyp von preg_replace lautet wie folgt:
gemischt preg_replace ( gemischt pattern,mixeersatz, gemischt subject[,intlimit = -1 [, int &count]])Buchstabe ZählenGongKannBeschreibenBeschreiben : Suchen Sie im Wort Symbol Zeichenfolgensubjekt nach pattern,ran verwenden Sie Ersatz, um zu ersetzen, wenn limit bedeutet steht für Begrenzt auf HergestelltErsatzErsatzlimit mal.pregreplacecallbackpregreplace识,不同的是pregreplaceback使用一个回调函数callback来代替replacement.−例1将字符串”hello,中国”中的hello替换为′你好′;如果不是用正则:str=’hello,中国’; str=strreplace(′hello′,′你好′,str) 或是使用str=substrreplace(str,’你好’,0,5) 使用正则 pattern=′/hello/′;str=preg_replace (pattern,′你好′,str); - 例2 去除字符串”gawwenngeeojjgegop”中连续相同的字母

$str='gawwenngeeojjgegop';$pattern='/(.)\1/';$str=preg_replace($pattern,'',$str);

解析:当然这样可能会遇到,当第一次去除了重复了字符串后,又出来重复的字符串。如字符串味’gewwenngeeojjgegop’,针对这中问题,当然,这样的话,通过判断,继续替换下去。

  • 例3 
    将字符串中”age13gegep3iorji65k65k”;中出现的连续两个数字改为第二个数字,如字符串中13被改为3

$str='age13gegep3iorji65k65k';$pattern='/(\d)(\d)/';$str=preg_replace($pattern,'$2', $str);

解析:$n在正则表达式外使用反向引用。n代表第几次匹配到的结果。

php中字符串分割

不适用正则

php提供了explode函数去分割字符串,与其对应的是implode。关于explode原型如下: 
array explode ( string delimiter,stringstring [, int $limit ] ) 
delimiter:边界上的分隔字符。 
string:输入的字符串。 
limit:如果设置了 limit 参数并且是正数,则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。如果 limit 参数是负数,则返回除了最后的 -limit 个元素外的所有元素。如果 limit 是 0,则会被当做 1。

使用正则

关于通过正则表达式进行字符串分割,php提供了split、preg_split 函数。preg_split() 函数,通常是比 split() 更快的替代方案。 
array preg_split ( string pattern,stringsubject [, int limit=1[,intflags = 0 ]] )

  • 例题 
    将字符串 ‘http://blog.csdn.net/hsd2012/article/details/51152810‘按照’/’进行分割 
    解法一:

$str='http://blog.csdn.net/hsd2012/article/details/51152810';$str=explode('/', $str);

解法二:

$str='http://blog.csdn.net/hsd2012/article/details/51152810';$pattern='/\//';  /*因为/为特殊字符,需要转移*/$str=preg_split ($pattern, $str);

php中贪婪匹配与惰性匹配

  • 贪婪匹配:就是匹配尽可能多的字符。 
    比如,正则表达式中m.*n,它将匹配最长以m开始,n结尾的字符串。如果用它来搜索manmpndegenc的话,它将匹配到的字符串是manmpndegen而非man。可以这样想,当匹配到m的时候,它将从后面往前匹配字符n。

  • 懒惰匹配:就是匹配尽可能少的字符。 
    有的时候,我们需要并不是去贪婪匹配,而是尽可能少的去匹配。这时候,就需要将其转为惰性匹配。怎样将一个贪婪匹配转为惰性匹配呢?只需要在其后面添加一个”?”即可。如m.*?n将匹配manmpndegenc,匹配到的字符串是man。

函数符 描述
*? 零次或多次,但尽可能少的匹配
+? 一次或多次,但尽可能少的匹配
?? 0次或1次,但尽可能少的匹配
{n,}? 至少n次,但尽可能少的匹配
{n,m}? n到m次 ,但尽可能少的匹配

php正则表达式之回溯与固态分组

回溯

首先我们需要清楚什么是回溯,回溯就像是在走岔路口,当遇到岔路的时候就先在每个路口做一个标记。如果走了死路,就可以照原路返回,直到遇见之前所做过的标记,标记着还未尝试过的道路。如果那条路也走不能,可以继续返回,找到下一个标记,如此重复,直到找到出路,或者直到完成所有没有尝试过的路。首先我们看例题

$str='aageacwgewcaw';$pattern='/a\w*c/i';$str=preg_match($pattern, $str);

看到上面的程序,可能都清楚是什么意思,就是匹配$str是否包含这样一个由”a+0个或多个字母+c”不区分大小写的字符串。但是至于程序怎样去匹配的呢?匹配的过程中,回溯了多少次呢?

匹配过程 接下来操作描述
‘a\w*c’中a匹配到’aageacwgewcaw’中第一个字符a \w进行下一个字符匹配
因为\w是贪婪匹配,会一直匹配到’aageacwgewcaw’中最后一个字符w c进行下一个字符匹配时
‘a\w*c’中c发现没有可以匹配的 于是\w匹配进行第一次回溯,匹配到倒数第二个字符a
‘a\w*c’中c发现还是没有可以匹配的 于是\w匹配进行第二次回溯,匹配到倒数第三个字符c
‘a\w*c’中c匹配成功 匹配结束返回结果

现在,如果我们将pattern为pattern=’/a\w*?c/i’;又会回溯多少次呢?正确答案是回溯四次。

固态分组

固态分组,目的就是减少回溯次数, 使用(?>…)括号中的匹配时如果产生了备选状态,那么一旦离开括号便会被立即 引擎抛弃掉。举个典型的例子如: ‘\w+:’这个表达式在进行匹配时的流程是这样的,会优先去匹配所有的符合\w的字符,假如字符串的末尾没有’:’,即匹配没有找到冒号,此时触发回溯机制,他会迫使前面的\w+释放字符,并且在交还的字符中重新尝试与’:’作比对。但是问题出现在这里: \w是不包含冒号的,显然无论如何都不会匹配成功,可是依照回溯机制,引擎还是得硬着头皮往前找,这就是对资源的浪费。所以我们就需要避免这种回溯,对此的方法就是将前面匹配到的内容固化,不令其存储备用状态!,那么引擎就会因为没有备用状态可用而只得结束匹配过程。大大减少回溯的次数。 
如下代码,就不会进行回溯:

$str='nihaoaheloo';$pattern='/(?>\w+):/';$rs=preg_match($pattern, $str);

当然有的时候,又需慎用固态分组,如下,我要检查$str中是否包含以a结尾的字符串,很明显是包含的,但是因为使用了固态分组,反而达不到我们想要的效果

$str='nihaoahelaa';$pattern1='/(?>\w+)a/';$pattern2='/\w+a/';$rs=preg_match($pattern1, $str);//0$rs=preg_match($pattern2, $str);//1

php中其他常用字符串操作函数

  • 字符串截取截取 
    string substr ( string string,intstart [, int length])stringmbsubstr(stringstr , int start[,intlength = NULL [, string $encoding = mb_internal_encoding() ]] )

  • 字符串中大小写转换 
    strtoupper 
    strtolower 
    ucfirst 
    ucwords

  • 字符串比较 
    -strcmp、strcasecmp、strnatcmp

  • 字符串过滤

  • 字符串翻转 
    strrev($str);

  • 字符串随机排序 
    string str_shuffle ( string $str )

Ergänzend

So führen Sie einen E-Mail-Abgleich, einen URL-Abgleich und einen Mobiltelefon-Abgleich durch

Verwenden Sie die preg_match-Funktion für den Abgleich. Der folgende Inhalt wird von TP kopiert.
E-Mail-Bestätigung
pattern=/w+([+. ]w+)@w+([ .]w+).w+([.]w+)∗/';
URL-Matching
pattern='/^http(s ?)://(?:[A-za-z0-9-]+.)+[A-za-z]{2,4}(:d+)?(?:[/?#][/= ?%-&~`@[]':+!.#w]*)?/'
Mobiltelefonverifizierung
p attern=/1 [3458]d10/';

Die Vor- und Nachteile regulärer Ausdrücke in PHP

Reguläre Ausdrücke in PHP können uns manchmal dabei helfen, viele schwierige Matching- oder Ersetzungsprobleme in PHP-Funktionen zu lösen. Dann müssen wir oft die Effizienz regulärer Ausdrücke in PHP berücksichtigen. Wenn wir also die Verwendung regulärer Ausdrücke zu bestimmten Zeiten vermeiden können, sollten wir versuchen, sie nicht zu verwenden, es sei denn, sie müssen in bestimmten Situationen verwendet werden, oder wir können sie effektiv reduzieren Anzahl der Backtrackings.

Verwandte Empfehlungen:

PHP regulärer Ausdruck (hinzugefügt 177 Mobiltelefonnummern)

PHP regulärer Ausdruck teilen

Das obige ist der detaillierte Inhalt vonReguläre Beziehungen in PHP. 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