Maison > Article > développement back-end > Résumé des fonctions courantes utilisées dans les expressions régulières PHP
Il existe deux ensembles de bibliothèques de fonctions d'expressions régulières en PHP. Un ensemble est fourni par la bibliothèque PCRE (Perl Compatible Regular Expression). La bibliothèque PCRE implémente la correspondance de modèles d'expressions régulières en utilisant les mêmes règles de syntaxe que Perl, en utilisant des fonctions nommées avec le préfixe "preg_". L'autre ensemble est fourni par la bibliothèque d'extensions POSIX (Portable Operation System interface). Les expressions régulières étendues POSIX sont définies par POSIX 1003.2 et utilisent généralement des fonctions nommées avec le préfixe « ereg_ ».
Les fonctions des deux bibliothèques de fonctions sont similaires, mais l'efficacité d'exécution est légèrement différente. D'une manière générale, pour réaliser la même fonction, l'efficacité de l'utilisation de la bibliothèque PCRE est légèrement supérieure. Son utilisation est décrite en détail ci-dessous.
6.3.1 Correspondance d'expressions régulières
1. preg_match()
Prototype de fonction : int preg_match (string $pattern, string $content [, array $matches])
la fonction preg_match() recherche dans la chaîne $content l'expression régulière donnée par $pattern Matching content. Si $matches est fourni, les résultats correspondants y sont placés. $matches[0] contiendra le texte qui correspond à l'ensemble du modèle, $matches[1] contiendra la première correspondance capturée de l'élément de modèle entre parenthèses, et ainsi de suite. Cette fonction n'effectue qu'une seule correspondance et renvoie finalement le nombre de résultats correspondants de 0 ou 1. Le listing 6.1 montre un exemple de code pour la fonction preg_match().
Code 6.1 Correspondance de date et d'heure
<?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"; } ?>
Il s'agit d'un exemple simple de correspondance de chaîne de texte dynamique. En supposant que l'heure système actuelle est « 13 h 25 le 17 août 2006 », le contenu suivant sera affiché.
L'heure de correspondance est : 2006-08-17 01:25 pm
La date actuelle est : 2006-08-17
L'heure actuelle est : 01:25 pm
2. ereg() et eregi()
ereg() est la fonction de correspondance pour les expressions régulières dans la bibliothèque d'extensions POSIX. eregi() est une version ignorant la casse de la fonction ereg(). Les deux ont des fonctions similaires à preg_match, mais la fonction renvoie une valeur booléenne indiquant si la correspondance a réussi ou non. Il convient de noter que le premier paramètre de la fonction de bibliothèque d'extension POSIX accepte une chaîne d'expression régulière, c'est-à-dire qu'aucun délimiteur n'est requis. Par exemple, le listing 6.2 est une méthode permettant de vérifier la sécurité des noms de fichiers.
Code 6.2 Vérification de sécurité du nom de fichier
<?php $username = $_SERVER['REMOTE_USER']; $filename = $_GET['file']; //对文件名进行过滤,以保证系统安全 if (!ereg('^[^./][^/]*$', $userfile)) { die('这不是一个非法的文件名!'); } //对用户名进行过滤 if (!ereg('^[^./][^/]*$', $username)) { die('这不是一个无效的用户名'); } //通过安全过滤,拼合文件路径 $thefile = "/home/$username/$filename"; ?>
Habituellement, l'utilisation de la fonction de correspondance d'expressions régulières compatible Perl perg_match() sera plus rapide que l'utilisation de ereg() ou eregi() quick. Si vous souhaitez simplement savoir si une chaîne contient une certaine sous-chaîne, il est recommandé d'utiliser la fonction strstr() ou strpos().
3. preg_grep()
Prototype de fonction : tableau preg_grep (string $pattern, array $input)
La fonction preg_grep() renvoie un tableau, qui inclut les cellules du tableau $input qui correspondent au modèle $pattern donné. Preg_grep() effectue également uniquement une correspondance pour chaque élément du tableau d'entrée $input. Le listing 6.3 donne un exemple qui illustre simplement l'utilisation de la fonction preg_grep().
Code 6.3 Correspondance de requêtes de tableau
<?php $subjects = array( "Mechanical Engineering", "Medicine", "Social Science", "Agriculture", "Commercial Science", "Politics" ); //匹配所有仅由有一个单词组成的科目名 $alonewords = preg_grep("/^[a-z]*$/i", $subjects); ?>
6.3.2 Correspondance globale d'expressions régulières
1. preg_match_all()
Similaire à la fonction preg_match(). Si le troisième paramètre est utilisé, toutes les correspondances possibles seront mises. Cette fonction renvoie le nombre de fois où le modèle entier correspond (éventuellement 0) et renvoie False si une erreur se produit. Vous trouverez ci-dessous un exemple de conversion d'une adresse de lien URL sous forme de texte en code HTML. Le listing 6.4 est un exemple d'utilisation de la fonction preg_match_all().
Code 6.4 Convertir l'adresse du lien dans le texte en 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. Correspondance multiligne
Il est difficile d'effectuer des opérations de correspondance complexes uniquement en utilisant des fonctions de table normales sous POSIX. Par exemple, effectuez des recherches de correspondance sur des fichiers entiers (en particulier du texte multiligne). Une façon de procéder en utilisant ereg() consiste à le faire sur des lignes séparées. L'exemple du Listing 6.5 montre comment ereg() assigne les paramètres du fichier INI à un tableau.
Code 6.5 Correspondance multiligne du contenu du fichier
<?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); ?>
Conseils
Ceci est juste pour faciliter l'illustration du problème. Pour analyser un fichier *.ini, le meilleur moyen est d'utiliser la fonction parse_ini_file(). Cette fonction analyse directement le fichier *.ini dans un grand tableau.
6.3.3 Remplacement d'expression régulière
1. ereg_replace() et eregi_replace()
Prototype de fonction : string ereg_replace (string $pattern, string $replacement, string $string)
string eregi_replace (string $pattern, string $replacement, string $string)
ereg_replace () Recherchez la chaîne de modèle $pattern dans $string et remplacez le résultat correspondant par $replacement. Lorsque $pattern contient des unités de motif (ou sous-motifs), les positions sous la forme "1" ou "$1" dans $replacement seront remplacées par le contenu correspondant à ces sous-motifs. et"
<?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中文网!
相关文章: