Es gibt zwei Sätze von Funktionsbibliotheken für reguläre Ausdrücke in PHP. Ein Satz wird von der PCRE-Bibliothek (Perl Compatible Regular Expression) bereitgestellt. Die PCRE-Bibliothek implementiert den Mustervergleich für reguläre Ausdrücke unter Verwendung derselben Syntaxregeln wie Perl und verwendet Funktionen, die mit dem Präfix „preg_“ benannt sind. Der andere Satz wird von der POSIX-Erweiterungsbibliothek (Portable Operation System Interface) bereitgestellt. Erweiterte reguläre POSIX-Ausdrücke werden durch POSIX 1003.2 definiert und verwenden im Allgemeinen Funktionen, die mit dem Präfix „ereg_“ benannt sind.
Die Funktionen der beiden Funktionsbibliotheken sind ähnlich, die Ausführungseffizienz unterscheidet sich jedoch geringfügig. Um dieselbe Funktion zu erreichen, ist die Effizienz der Verwendung der PCRE-Bibliothek im Allgemeinen etwas höher. Seine Verwendung wird im Folgenden ausführlich beschrieben.
6.3.1 Regulärer Ausdrucksabgleich
1. preg_match()
Funktionsprototyp: int preg_match (string $pattern, string $content [, array $matches])
preg_match()-Funktion durchsucht den $content-String nach dem regulären Ausdruck, der durch $pattern Matching content angegeben wird. Wenn $matches angegeben ist, werden die übereinstimmenden Ergebnisse darin platziert. $matches[0] enthält den Text, der mit dem gesamten Muster übereinstimmt, $matches[1] enthält die erste erfasste Übereinstimmung des Musterelements in Klammern usw. Diese Funktion führt nur einen Match durch und gibt letztendlich die Anzahl der Matching-Ergebnisse von 0 oder 1 zurück. Listing 6.1 zeigt ein Codebeispiel für die Funktion preg_match().
Code 6.1 Datums- und Uhrzeitabgleich
<?php //需要匹配的字符串。date函数返回当前时间 $content = "Current date and time is ".date("Y-m-d h:i a").", we are learning PHP together."; //使用通常的方法匹配时间 if (preg_match ("/\d{4}-\d{2}-\d{2} \d{2}:\d{2} [ap]m/", $content, $m)) { echo "匹配的时间是:" .$m[0]. "\n"; } //由于时间的模式明显,也可以简单的匹配 if (preg_match ("/([\d-]{10}) ([\d:]{5} [ap]m)/", $content, $m)) { echo "当前日期是:" .$m[1]. "\n"; echo "当前时间是:" .$m[2]. "\n"; } ?>
Dies ist ein einfaches Beispiel für den dynamischen Textzeichenfolgenabgleich. Unter der Annahme, dass die aktuelle Systemzeit „13:25 Uhr am 17. August 2006“ ist, wird der folgende Inhalt ausgegeben.
Die passende Zeit ist: 17.08.2006 13:25 Uhr
Das aktuelle Datum ist: 17.08.2006
Die aktuelle Zeit ist: 13:25 Uhr
2. ereg() und eregi()
ereg() ist die Matching-Funktion für reguläre Ausdrücke in der POSIX-Erweiterungsbibliothek. eregi() ist eine Version der Funktion ereg(), die die Groß- und Kleinschreibung ignoriert. Beide haben ähnliche Funktionen wie preg_match, die Funktion gibt jedoch einen booleschen Wert zurück, der angibt, ob die Übereinstimmung erfolgreich war oder nicht. Es ist zu beachten, dass der erste Parameter der POSIX-Erweiterungsbibliotheksfunktion eine reguläre Ausdruckszeichenfolge akzeptiert, d. h. es ist kein Trennzeichen erforderlich. Listing 6.2 ist beispielsweise eine Methode zur Überprüfung der Sicherheit von Dateinamen.
Code 6.2 Sicherheitsprüfung des Dateinamens
<?php $username = $_SERVER['REMOTE_USER']; $filename = $_GET['file']; //对文件名进行过滤,以保证系统安全 if (!ereg('^[^./][^/]*$', $userfile)) { die('这不是一个非法的文件名!'); } //对用户名进行过滤 if (!ereg('^[^./][^/]*$', $username)) { die('这不是一个无效的用户名'); } //通过安全过滤,拼合文件路径 $thefile = "/home/$username/$filename"; ?>
Normalerweise ist die Verwendung der Perl-kompatiblen Funktion zum Abgleich regulärer Ausdrücke perg_match() schneller als die Verwendung von ereg() oder eregi() quick. Wenn Sie lediglich herausfinden möchten, ob ein String einen bestimmten Teilstring enthält, empfiehlt sich die Verwendung der Funktion strstr() oder strpos().
3. preg_grep()
Funktionsprototyp: Array preg_grep (String $pattern, Array $input)
Die Funktion preg_grep() gibt ein Array zurück, das die Zellen im $input-Array enthält, die dem angegebenen $pattern-Muster entsprechen. Preg_grep() führt außerdem nur einen Abgleich für jedes Element im Eingabearray $input durch. Das Beispiel in Listing 6.3 veranschaulicht lediglich die Verwendung der Funktion preg_grep().
Code 6.3 Array-Abfrageabgleich
<?php $subjects = array( "Mechanical Engineering", "Medicine", "Social Science", "Agriculture", "Commercial Science", "Politics" ); //匹配所有仅由有一个单词组成的科目名 $alonewords = preg_grep("/^[a-z]*$/i", $subjects); ?>
6.3.2 Globaler regulärer Ausdrucksabgleich
1. preg_match_all()
Ähnlich der Funktion preg_match(). Wenn der dritte Parameter verwendet wird, werden alle möglichen Übereinstimmungen gesetzt. Diese Funktion gibt die Anzahl der Übereinstimmungen mit dem gesamten Muster zurück (möglicherweise 0) und gibt False zurück, wenn ein Fehler auftritt. Nachfolgend finden Sie ein Beispiel für die Konvertierung einer URL-Linkadresse im Text in HTML-Code. Listing 6.4 ist ein Beispiel für die Verwendung der Funktion preg_match_all().
Code 6.4 Konvertieren Sie die Linkadresse im Text in HTML
<?php //功能:将文本中的链接地址转成HTML //输入:字符串 //输出:字符串 function url2html($text) { //匹配一个URL,直到出现空白为止 preg_match_all("/http:\/\/?[^\s]+/i", $text, $links); //设置页面显示URL地址的长度 $max_size = 40; foreach($links[0] as $link_url) { //计算URL的长度。如果超过$max_size的设置,则缩短。 $len = strlen($link_url); if($len > $max_size) { $link_text = substr($link_url, 0, $max_size)."..."; } else { $link_text = $link_url; } //生成HTML文字 $text = str_replace($link_url,"<a href='$link_url'>$link_text</a>",$text); } return $text; } //运行实例 $str = “这是一个包含多个URL链接地址的多行文字。欢迎访问http://www.php.cn”; print url2html($str); /*输出结果 这是一个包含多个URL链接地址的多行文字。欢迎访问<a href='http://www.php.cn'> http://www.php.cn</a> */ ?>
2. Mehrzeiliger Abgleich
Es ist unter POSIX schwierig, komplexe Abgleichsvorgänge nur mit regulären Tabellenfunktionen durchzuführen. Führen Sie beispielsweise passende Suchvorgänge für ganze Dateien durch (insbesondere für mehrzeiligen Text). Eine Möglichkeit, dies mit ereg() zu tun, besteht darin, es in separaten Zeilen zu tun. Das Beispiel in Listing 6.5 zeigt, wie ereg() die Parameter der INI-Datei einem Array zuweist.
Code 6.5 Mehrzeiliger Abgleich von Dateiinhalten
<?php $rows = file('php.ini'); //将php.ini文件读到数组中 //循环遍历 foreach($rows as $line) { If(trim($line)) { //将匹配成功的参数写入数组中 if(eregi("^([a-z0-9_.]*) *=(.*)", $line, $matches)) { $options[$matches[1]] = trim($matches[2]); } unset($matches); } } //输出参数结果 print_r($options); ?>
Tipps
Dies dient nur der einfacheren Veranschaulichung des Problems. Um eine *.ini-Datei zu analysieren, verwenden Sie am besten die Funktion parse_ini_file(). Diese Funktion analysiert die *.ini-Datei direkt in ein großes Array.
6.3.3 Ersetzung regulärer Ausdrücke
1. ereg_replace() und eregi_replace()
Funktionsprototyp: string ereg_replace (string $pattern, string $replacement, string $string)
string eregi_replace (string $pattern, string $replacement, string $string)
ereg_replace ()Suchen Sie nach der Musterzeichenfolge $pattern in $string und ersetzen Sie das übereinstimmende Ergebnis durch $replacement. Wenn $pattern Mustereinheiten (oder Untermuster) enthält, werden Positionen in der Form „1“ oder „$1“ in $replacement durch den Inhalt ersetzt, der mit diesen Untermustern übereinstimmt. Und"
<?php $lines = file('source.php'); //将文件读入数组中 for($i=0; $i<count($lines); $i++) { //将行末以“\\”或“#”开头的注释去掉 $lines[$i] = eregi_replace("(\/\/|#).*$", "", $lines[$i]); //将行末的空白消除 $lines[$i] = eregi_replace("[ \n\r\t\v\f]*$", "\r\n", $lines[$i]); } //整理后输出到页面 echo htmlspecialchars(join("",$lines)); ?>
2.preg_replace()
函数原型:mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject [, int $limit])
preg_replace较ereg_replace的功能更加强大。其前三个参数均可以使用数组;第四个参数$limit可以设置替换的次数,默认为全部替换。代码6.7是一个数组替换的应用实例。
代码6.7 数组替换
<?php //字符串 $string = "Name: {Name}<br>\nEmail: {Email}<br>\nAddress: {Address}<br>\n"; //模式 $patterns =array( "/{Address}/", "/{Name}/", "/{Email}/" ); //替换字串 $replacements = array ( "No.5, Wilson St., New York, U.S.A", "Thomas Ching", "tom@emailaddress.com", ); //输出模式替换结果 print preg_replace($patterns, $replacements, $string); ?>
输出结果如下。
Name: Thomas Ching",
Email: tom@emailaddress.com
Address: No.5, Wilson St., New York, U.S.A
在preg_replace的正则表达式中可以使用模式修正符“e”。其作用是将匹配结果用作表达式,并且可以进行重新运算。例如:
<?php $html_body = “<HTML><Body><H1>TEST</H1>My Picture<Img src=”my.gif”></Body></HTML>”; //输出结果中HTML标签将全部为小写字母 echo preg_replace ( "/(<\/?)(\w+)([^>]*>)/e", "'\\1'.strtolower('\\2').'\\3'", //此处的模式变量\\2将被strtolower转换为小写字符 $html_body); ?>
提示
preg_replace函数使用了Perl兼容正则表达式语法,通常是比ereg_replace更快的替代方案。如果仅对字符串做简单的替换,可以使用str_replace函数。
6.3.4 正则表达式的拆分
1.split()和spliti()
函数原型:array split (string $pattern, string $string [, int $limit])
本函数返回一个字符串数组,每个单元为$string经正则表达式$pattern作为边界分割出的子串。如 果设定了$limit,则返回的数组最多包含$limit个单元。而其中最后一个单元包含了$string中剩余的所有部分。spliti是split的 忽略大小版本。代码6.8是一个经常用到关于日期的示例。
代码6.8 日期的拆分
<?php $date = "08/30/2006"; //分隔符可以是斜线,点,或横线 list($month, $day, $year) = split ('[/.-]', $date); //输出为另一种时间格式 echo "Month: $month; Day: $day; Year: $year<br />\n"; ?>
2.preg_split()
本函数与split函数功能一致。代码6.9是一个查找文章中单词数量的示例。
代码6.9 查找文章中单词数量
<?php $seek = array(); $text = "I have a dream that one day I can make it. So just do it, nothing is impossible!"; //将字符串按空白,标点符号拆分(每个标点后也可能跟有空格) $words = preg_split("/[.,;!\s']\s*/", $text); foreach($words as $val) { $seek[strtolower($val)] ++; } echo "共有大约" .count($words). "个单词。"; echo "其中共有" .$seek['i']. "个单词“I”。"; ?>
提示
preg_split() 函数使用了Perl兼容正则表达式语法,通常是比split()更快的替代方案。使用正则表达式的方法分割字符串,可以使用更广泛的分隔字符。例如,上面 对日期格式和单词处理的分析。如果仅用某个特定的字符进行分割,建议使用explode()函数,它不调用正则表达式引擎,因此速度是最快的。
更多PHP 正则表达式常用函数使用小结相关文章请关注PHP中文网!
相关文章: