Heim >Backend-Entwicklung >PHP-Tutorial >Wissenszusammenfassung über reguläre Ausdrücke in PHP-Interviews (sehr detailliert)
Dieser Artikel bietet Ihnen eine (sehr detaillierte) Wissenszusammenfassung über reguläre Ausdrücke in PHP-Interviews. Ich hoffe, dass er für Freunde in Not hilfreich ist.
Verwandte Empfehlungen: „Zusammenfassung der PHP-Interviewfragen 2019 (Sammlung)
1. Einleitung
1. Was ist ein regulärer Ausdruck?
Ein regulärer Ausdruck ist eine Formel, die ein bestimmtes Muster verwendet, um einen Stringtyp abzugleichen.Reguläre Ausdrücke verwenden eine einzelne Zeichenfolge, um eine Reihe von Zeichenfolgen zu beschreiben und abzugleichen, die einer bestimmten Syntaxregel entsprechen.
Reguläre Ausdrücke sind umständlich, aber leistungsstark. Wenn Sie sie erst einmal gelernt haben, steigern Sie nicht nur Ihre Effizienz, sondern geben Ihnen auch ein absolutes Erfolgserlebnis. Solange Sie dieses Tutorial sorgfältig lesen und bei der Anwendung bestimmte Referenzen beachten, ist die Beherrschung regulärer Ausdrücke kein Problem.
Viele Programmiersprachen unterstützen String-Operationen mit regulären Ausdrücken.
2. Die Rolle regulärer Ausdrücke
Zeichenfolgen aufteilen, suchen, abgleichen, ersetzen3. Reguläre Ausdrücke in PHP
verfügt über zwei Sätze von Funktionsbibliotheken für reguläre Ausdrücke in PHP. Die Funktionen der beiden sind ähnlich, aber die Ausführungseffizienz ist etwas unterschiedlich: Ein Satz besteht aus PCRE (Perl Kompatibler regulärer Ausdruck), der von der Bibliothek bereitgestellt wird. Funktionen mit dem Präfix „preg_“;Ein Satz, der von POSIX-Erweiterungen (Portable Operating System Interface of Unix) bereitgestellt wird. Verwenden Sie Funktionen mit dem Präfix „ereg_“;
Die PCRE-Syntax unterstützt mehr Funktionen und ist leistungsfähiger als die POSIX-Syntax. Daher stellt dieser Artikel hauptsächlich den regulären Ausdruck der
PCRE-Syntax
vor. 4. Die Zusammensetzung regulärer Ausdrücke
In PHP ist ein regulärer Ausdruck geteilt in drei Teile: Trennzeichen, Ausdrücke und Mustermodifikatoren.Trennzeichen
Trennzeichen können alle ASCII-Zeichen außer Buchstaben, Zahlen, Backslash () und Leerzeichen sein.Die am häufigsten verwendeten Trennzeichen sind Schrägstrich (/), Rautesymbol (#) und Negationssymbol (~).
Der Ausdruck
besteht aus einigen Sonderzeichen und nicht-speziellen Zeichenfolgen. Es ist der Hauptteil, der die Übereinstimmungsregeln regulärer Ausdrücke bestimmt.2. Trennzeichen
1. Auswahl des Trennzeichens
Bei Verwendung der PCRE-Funktion muss der reguläre Ausdruck eingeschlossen werden durch Trennzeichen. Das Trennzeichen kann jedes ASCII-Zeichen außer Buchstaben, Zahlen, Backslash (
) und Leerzeichen verwenden.
Die am häufigsten verwendeten Trennzeichen sind Schrägstrich (), Rautesymbol (/
) und Negationssymbol (#
). ~
/foo bar/ (合法) #^[^0-9]$# (合法) +php+ (合法) %[a-zA-Z0-9_-]% (合法)
#[a-zA-Z0-9_-]/ (非法,两边的分隔符不同) a[a-zA-Z0-9_-]a (非法,分隔符不能是字母) \[a-zA-Z0-9_-]\ (非法,分隔符不能是反斜线(`\`))
Zusätzlich zu den oben genannten Trennzeichen können Sie auch Trennzeichen im Klammerstil verwenden. Die linke Klammer und die rechte Klammer dienen jeweils als Start- und Endtrennzeichen.
{this is a pattern}2. Verwendung von Trennzeichen
Wenn ein Trennzeichen in einem regulären Ausdruck verwendet wird, muss es mit einem Backslash () maskiert werden. Wenn Trennzeichen häufig in regulären Ausdrücken vorkommen, ist es zur besseren Lesbarkeit besser, andere Trennzeichen zu verwenden.
/http:\/\// #http://#
Wenn Sie eine Zeichenfolge in einen regulären Ausdruck einfügen müssen, können Sie die Funktion preg_quote() verwenden, um sie zu maskieren. Der zweite Parameter (optional) kann verwendet werden, um das Trennzeichen anzugeben, das maskiert werden muss.
//在这个例子中,preg_quote($word) 用于保持星号和正斜杠(/)原文涵义,使其不使用正则表达式中的特殊语义。 $textBody = "This book is */very/* difficult to find."; $word = "*/very/*"; $reg = "/" . preg_quote($word, '/') . "/"; echo $reg; // 输出 '/\*\/very\/\*/' echo preg_replace ($reg, "<i>" . $word . "</i>", $textBody); // 输出 'This book is <i>*/very/*</i> difficult to find.'
Sie können nach dem Endtrennzeichen Mustermodifikatoren hinzufügen, um den Matching-Effekt zu beeinflussen.
Das folgende Beispiel ist eine Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung3. Metazeichen1. Escape-Zeichen
Charakter | Beschreibung |
---|---|
Markieren Sie das nächste Zeichen als Sonderzeichen, Literalzeichen oder Rückwärtsverweis. Zum Beispiel entspricht „n“ dem Zeichen „n“. 'n' entspricht einem Zeilenumbruchzeichen. Die Sequenz '' entspricht „“ und „(“ entspricht „(“. |
字符 | 描述 |
---|---|
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用。 例如,'n' 匹配字符 "n"。'n' 匹配一个换行符。序列 '' 匹配 "" 而 "(" 则匹配 "("。 |
字符 | 描述 |
---|---|
* |
匹配前面的子表达式零次或多次。 例如,zo 能匹配 "z" 以及 "zoo"。 等价于{0,}。 |
+ |
匹配前面的子表达式一次或多次。 例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 |
? |
当该字符作为量词,表示匹配前面的子表达式零次或一次。 例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等价于 {0,1}。 |
{n} |
n 是一个非负整数。匹配确定的 n 次。 例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 |
{n,} |
n 是一个非负整数。至少匹配n 次。 例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 |
{n,m} |
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 |
字符 | 描述 | |
---|---|---|
d | 匹配一个数字字符。等价于 [0-9] 。 | |
D | 匹配一个非数字字符。等价于 [^0-9] 。 | |
w | 匹配字母、数字、下划线。等价于 [A-Za-z0-9_] 。 | |
W | 匹配非字母、数字、下划线。等价于 [^A-Za-z0-9_] 。 | |
s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv] 。 | |
S | 匹配任何非空白字符。等价于 [^ fnrtv] 。 | |
. | 匹配除换行符(n、r)之外的任何单个字符。 要匹配包括 'n' 在内的任何字符,请使用像"(. | n)"的正则表达式。 |
字符 | 描述 |
---|---|
n | 匹配一个换行符。等价于 x0a 和 cJ。 |
r | 匹配一个回车符。等价于 x0d 和 cM。 |
t | 匹配一个制表符。等价于 x09 和 cI。 |
字符 | 描述 |
---|---|
| | 竖线字符 | 可以匹配多选一的情况。 例如,'z|food' 能匹配 "z" 或 "food"。'(z|f|g)ood' 则匹配 "zood"、"food"或 "good"。 |
字符 | 描述 |
---|---|
? | 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。 非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。 |
如果设置了这个修饰符,正则表达式中的字母会进行大小写不敏感匹配。
默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行)。
"行首"元字符 (^
) 仅匹配字符串的开始位置, 而"行末"元字符 ($
) 仅匹配字符串末尾, 或者最后的换行符(除非设置了 D 修饰符)。
当这个修饰符设置之后,“行首”元字符 (^
) 和“行末”元字符 ($
) 就会匹配目标字符串中任意换行符之前或之后,另外,还分别匹配目标字符串的最开始和最末尾位置。
如果目标字符串 中没有 "n" 字符,或者正则表达式中没有出现 ^
或 $
,设置这个修饰符不产生任何影响。
默认情况下,点号(.
)不匹配换行符。
如果设置了这个修饰符,正则表达式中的点号元字符匹配所有字符,包含换行符。
这个修饰符与前面提到的 ?
作用相同,使正则表达式默认为非贪婪匹配,通过量词后紧跟 ?
的方式可以使其转为贪婪匹配。
在非贪婪模式,通常不能匹配超过 pcre.backtrack_limit 的字符。
$str = '<b>abc</b><b>def</b>'; $pattern = '/<b>.*</b>/'; preg_replace($pattern, '\\1', $str);<p><code>.*</code>会匹配 <code>abc</b><b>def</code></p> <h4><strong>非贪婪模式</strong></h4> <p><strong>方法一、使用 <code>?</code> 转为非贪婪模式</strong></p> <pre class="brush:php;toolbar:false">$str = '<b>abc</b><b>def</b>'; $pattern = '/<b>.*?</b>/'; preg_replace($pattern, '\\1', $str);
.*
会分别匹配 abc
,def
方法二、使用修饰符 U
转为非贪婪模式
$str = '<b>abc</b><b>def</b>'; $pattern = '/<b>.*</b>/U'; preg_replace($pattern, '\\1', $str);
此修正符使正则表达式和目标字符串都被认为是 utf-8 编码。
无效的目标字符串会导致 preg_* 函数什么都匹配不到;无效的正则表达式字符串会导致 E_WARNING 级别的错误。
$str = '中文'; $pattern = '/^[\x{4e00}-\x{9fa5}]+$/u'; if (preg_match($pattern, $str)) { echo '该字符串全是中文'; } else { echo '该字符串不全是中文'; }
默认情况下,如果使用 $
限制结尾字符,当字符串以一个换行符结尾时, $
符号还会匹配该换行符(但不会匹配之前的任何换行符)。
如果设置这个修饰符,正则表达式中的 $
符号仅匹配目标字符串的末尾。
如果设置了修饰符 m,这个修饰符被忽略。
如果设置了这个修饰符,正则表达式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略, 并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。
如果设置了这个修饰符,正则表达式被强制为"锚定"模式,也就是说约束匹配使其仅从 目标字符串的开始位置搜索。
当一个正则表达式需要多次使用的时候,为了得到匹配速度的提升,值得花费一些时间对其进行一些额外的分析。
如果设置了这个修饰符,这个额外的分析就会执行。
当前,这种对一个正则表达式的分析仅仅适用于非锚定模式的匹配(即没有单独的固定开始字符)。
使用 ( )
标记的开始和结束的多个原子,不仅是一个独立的单元,也是一个子表达式。
在一个 ( )
中的子表达式外面,反斜线紧跟一个大于 0 的数字,就是对之前出现的某个子表达式的后向引用。
后向引用用于重复搜索前面某个 ( )
中的子表达式匹配的文本。
(sens|respons)e and \1ibility
将会匹配 ”sense and sensibility” 和 ”response and responsibility”, 而不会匹配 ”sense and responsibility”
<?php $str = '<b>abc</b><b>def</b>'; $pattern = '/<b>(.*)<\/b><b>(.*)<\/b>/'; $replace = preg_replace($pattern, '\\1', $str); echo $replace . "\n"; $replace = preg_replace($pattern, '\\2', $str); echo $replace . "\n";
输出:
abc def
六、正则表达式常用PCRE函数
PHP官网的讲解已经很详细了,这里不再做多余的论述
UTF-8汉字编码范围是 0x4e00-0x9fa5
在ANSI(GB2312)环境下,0xb0-0xf7
,0xa1-0xfe
UTF-8要使用 u模式修正符 使模式字符串被当成 UTF-8
在ANSI(GB2312)环境下,要使用chr将Ascii码转换为字符
<?php $str = '中文'; $pattern = '/[\x{4e00}-\x{9fa5}]/u'; preg_match($pattern, $str, $match); var_dump($match);
<?php $str = '中文'; $pattern = '/['.chr(0xb0).'-'.chr(0xf7).']['.chr(0xa1).'-'.chr(0xfe).']/'; preg_match($pattern, $str, $match); var_dump($match);
<?php $str = '<img alt="高清大图" id="color" src="color.jpg" />'; $pattern = '/<img.*?src="(.*?)".*?\/?>/i'; preg_match($pattern, $str, $match); var_dump($match);
Das obige ist der detaillierte Inhalt vonWissenszusammenfassung über reguläre Ausdrücke in PHP-Interviews (sehr detailliert). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!