Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Diskussion über reguläre Ausdrücke in PHP

Eine kurze Diskussion über reguläre Ausdrücke in PHP

青灯夜游
青灯夜游nach vorne
2019-01-05 09:54:014138Durchsuche

Dieser Artikel stellt Ihnen die regulären Ausdrücke von PHP vor. Ich hoffe, dass er Ihnen als Referenz dienen wird.

Mind Map

Klicken Sie auf das Bild unten, um den spezifischen Inhalt anzuzeigen!

Einführung

Reguläre Ausdrücke, jeder sollte sich in der Entwicklung befinden. Das ist so Heutzutage gibt es in vielen Entwicklungssprachen reguläre Ausdrucksanwendungen wie Javascript, Java, .net, PHP usw. Heute werde ich Ihnen mein Verständnis von regulären Ausdrücken mitteilen . Beratung!

Begriffe, die Sie kennen müssen – Wie viel wissen Sie über die folgenden Begriffe?

Δ Trennzeichen

Δ Zeichenfeld

Δ Modifikator

Δ Qualifizierer

Δ Caret

Δ Platzhalter (Vorwärts-Vorprüfung, Rückwärts-Vorprüfung)

Δ Rückverweis

Δ Lazy Match

Δ Kommentare

Δ Nullzeichenbreite

Positionierung

Wann verwenden wir Was ist mit normal? Ausdrücke? Es reicht nicht aus, für alle Zeichenoperationen reguläre Ausdrücke zu verwenden. PHP verwendet in einigen Aspekten reguläre Ausdrücke, was sich tatsächlich auf die Effizienz auswirkt. Wenn wir auf das Parsen komplexer Textdaten stoßen, ist die Verwendung regulärer Ausdrücke die bessere Wahl.

Vorteile

Reguläre Ausdrücke können die Arbeitseffizienz verbessern beim Umgang mit komplexen Zeichenoperationen und Ihnen bis zu einem gewissen Grad die Kosten ersparen Menge an Code.

Nachteile

Wenn wir reguläre Ausdrücke verwenden, erhöhen komplexe reguläre Ausdrücke die Komplexität des Codes, was sehr frustrierend schwierig ist verstehen. Daher müssen wir manchmal Kommentare in reguläre Ausdrücke einfügen.

Gemeinsamer Modus

¤ Trennzeichen, normalerweise verwenden Sie „/“ als Trennzeichen für Anfang und Ende, Sie können auch „#“ verwenden.

Wann sollten Sie „#“ verwenden? Im Allgemeinen ist dies der Fall, wenn Ihre Zeichenfolge viele „/“-Zeichen enthält, da solche Zeichen während des regulären Ausdrucks maskiert werden müssen, z als uri .

Der Code, der das Trennzeichen „/“ verwendet, lautet wie folgt.

$regex = '/^http:\/\/([\w.]+)\/([\w]+)\/([\w]+)\.html$/i';
$str = 'http://www.youku.com/show_page/id_ABCDEFG.html';
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "\n";

$matches[0] in preg_match enthält die Zeichenfolge, die mit dem gesamten Muster übereinstimmt.

Der Code, der das Trennzeichen „#“ verwendet, lautet wie folgt: entgeht „/“ nicht!

$regex = '#^http://([\w.]+)/([\w]+)/([\w]+)\.html$#i';
$str = 'http://www.youku.com/show_page/id_ABCDEFG.html';
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "\n";

¤ Modifikator: Wird zum Ändern des regulären Codes verwendet Ausdrucksstilverhalten.

Was wir sehen ('/^http://([w.]+)/([w]+)/([w]+).html/ i') Das letzte „i“ darin ist der Modifikator, der bedeutet, dass die Groß- und Kleinschreibung ignoriert wird. Ein anderes, das wir häufig verwenden, ist „x“, was bedeutet, dass Leerzeichen ignoriert werden.

Beitragscode:

$regex = '/HELLO/';
$str = 'hello word';
$matches = array();

if(preg_match($regex, $str, $matches)){
    echo 'No i:Valid Successful!',"\n";
}

if(preg_match($regex.'i', $str, $matches)){
    echo 'YES i:Valid Successful!',"\n";
}

¤ Zeichenfeld: [w] Der mit eckigen Klammern erweiterte Teil ist das Zeichenfeld.

¤ Qualifizierer: Zum Beispiel [w]{3,5} oder [w]* oder [w]+. Die Symbole nach [w] stehen alle für Qualifikatoren. Die konkrete Bedeutung wird nun eingeführt.

{3,5} bedeutet 3 bis 5 Zeichen. {3,} besteht aus mehr als 3 Zeichen, {,5} aus bis zu 5 Zeichen und {3} aus drei Zeichen.

* bedeutet 0 bis mehr

* bedeutet 1 oder mehr.

¤ Das Caretzeichen

^:

> in einem Zeichenfeld (z. B. [^w]) bedeutet Negation (d. h. nicht einschließen) - —„Auswahl umkehren“

    > Wird vor dem Ausdruck platziert und bedeutet, dass mit dem aktuellen Zeichen begonnen wird. (/^n/i, bedeutet, mit n zu beginnen).

Beachten Sie, dass wir „“ oft als „Escape-Zeichen“ bezeichnen. Wird verwendet, um einige Sonderzeichen wie „.“ oder „/“ zu maskieren.

Platzhalter (Lookarounds): Bestätigen das Vorhandensein oder Fehlen bestimmter Zeichen in bestimmten Zeichenfolgen!

Es gibt zwei Arten von Lookarounds: Lookaheads (Vorwärts-Lookup ?=) und Lookbehinds (Reverse-Lookup?12a6abe747567c04f8a60d1c1175f753 Format:

Vorwärtssuche: (?=) Das entsprechende (?!) bedeutet negative Bedeutung

Rückwärtssuche: (?913d9cf7fbe83d54bb1ea153ef890ed6字符宽度:零

验证零字符代码

$regex = '/HE(?=L)LO/i';
$str = 'HELLO';
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "\n";

打印不出结果!

$regex = '/HE(?=L)LLO/i';
$str = 'HELLO';
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "\n";

 能打印出结果!

说明:(?=L)意思是HE后面紧跟一个L字符。但是(?=L)本身不占字符,要与(L)区分,(L)本身占一个字符。

捕获数据

没有指明类型而进行的分组,将会被获取,供以后使用。

> 指明类型指的是通配符。所以只有圆括号起始位置没有问号的才能被捕捉。

> 在同一个表达式内的引用叫做反向引用。

> 调用格式: \编号(如\1)。

$regex = '/^(Chuanshanjia)[\w\s!]+\1$/';    
$str = 'Chuanshanjia thank Chuanshanjia';
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "\n";

> 避免捕获数据

   格式:(?:pattern)

   优点:将使有效反向引用数量保持在最小,代码更加、清楚。

>命名捕获组

   格式:(?P5e64257b369329e4ba4d555318eb64af) 调用方式 (?P=组名)

$regex = &#39;/(?P<author>chuanshanjia)[\s]Is[\s](?P=author)/i&#39;;
$str = &#39;author:chuanshanjia Is chuanshanjia&#39;;
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "\n";

运行结果

惰性匹配(记住:会进行两部操作,请看下面的原理部分)

  格式:限定符?

     原理:"?":如果前面有限定符,会使用最小的数据。如“*”会取0个,而“+”会取1个,如过是{3,5}会取3个。

先看下面的两个代码:

代码1.

<?php
$regex = &#39;/heL*/i&#39;;
$str = &#39;heLLLLLLLLLLLLLLLL&#39;;
if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "\n";

结果1.

代码2

<?php
$regex = &#39;/heL*?/i&#39;;
$str = &#39;heLLLLLLLLLLLLLLLL&#39;;
if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "\n";

结果2

代码3,使用“+”

<?php
$regex = &#39;/heL+?/i&#39;;
$str = &#39;heLLLLLLLLLLLLLLLL&#39;;
if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "\n";

结果3

代码4,使用{3,5}

<?php
$regex = &#39;/heL{3,10}?/i&#39;;
$str = &#39;heLLLLLLLLLLLLLLLL&#39;;
if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "\n";

结果4

正则表达式的注释

格式:(?# 注释内容)

用途:主要用于复杂的注释

贡献代码:是一个用于连接MYSQL数据库的正则表达式

$regex = &#39;/
    ^host=(?<!\.)([\d.]+)(?!\.)                 (?#主机地址)
\|
    ([\w!@#$%^&*()_+\-]+)                       (?#用户名)
\|
    ([\w!@#$%^&*()_+\-]+)                       (?#密码)
(?!\|)$/ix&#39;;

$str = &#39;host=192.168.10.221|root|123456&#39;;
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "\n";

特殊字符 

特殊字符 解释
* 0到多次
+ 1到多次还可以写成{1,}
? 0或1次
. 匹配除换行符外的所有单个的字符
\w [a-zA-Z0-9_]
\s 空白字符(空格,换行符,回车符)[\t\n\r]
\d [0-9]

案例汇总

 1、PHP中文匹配

<?php
$str = "PHP编程";
if (preg_match("/([0-9a-zA-Z\x{4e00}-\x{9fa5}]+)/u",$str, $matches)) {
    var_dump($matches);
    echo "\n";
}

 以上就是本篇文章的全部内容,希望能对大家的学习有所帮助。更多精彩内容大家可以关注php中文网相关教程栏目!!!

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über reguläre Ausdrücke in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen