这个正则表达式有什么问题?

时间:2010-10-30 20:48:10

标签: php regex

我有以下字符串:

<?php
$string = '<meta name="Keywords" lang="fr" content="ecole commerce,
 apres bac, ecole management, ecole de management, écoles de commerce,
 école de management, classement ecole de commerce, ecole commerce paris,
 ecole superieure de commerce, concours ecole commerce, hec, esc, prepa,
 forum ecole commerce, avis ecole commerce" /><meta name="description"
 content="Tout pour s\'informer et échanger sur les écoles de commerce
 et de management, les concours, les classements, la prépa... Des
 témoignages et un forum pour faire le meilleur choix" /><meta
 name="robots" content="all" />';
?>

我试图通过这个正则表达式只得到它的“描述”元:

 <?php
 echo preg_replace('/(?:.*)name\="description" content\="(.*)"(?:.*)/i',
                                                                  '$1', $string);
 ?>

但我得到的是:

Tout pour s'informer et échanger sur les écoles de commerce et de management,
 les concours, les classements, la prépa... Des témoignages et un forum
 pour faire le meilleur choix" /><meta name="robots" content="all

那么,为什么额外" /><meta name="robots" content="all?!

ps:代码中没有换行符,我只是添加它们以便于阅读......

4 个答案:

答案 0 :(得分:2)

您还应该在正则表达式中添加选项U(Ungreedy)。在这种情况下,它匹配您的字符串的最后一个“,这就是您获得标记部分的原因。

preg_replace('/(?:.*)name\="description" content\="(.*)"(?:.*)/iU', '$1', $string);

请注意,您也可以使用以下内容替换它:

preg_replace('/(?:.*)name\="description" content\="([^"]*)"/i', '$1', $string);

[^“]表示”任何不是双引号的东西“。最后一个(?:。*)也没用。

当你想要匹配某些东西而不是替换它时,我也喜欢使用带有第三个参数的preg_match。基本上,我会像你这样做你想做的事情:

$var = array();
preg_match('/name\="description" content\="([^"]*)"/iU', $string, $var);

$ var [1]包含你的字符串,如果正则表达式找到匹配。

答案 1 :(得分:1)

不要使用贪婪的正则表达式,这将起作用:

<?php echo preg_replace('/(?:.*)name\="description" content\="(.*?)"(?:.*)/i', '$1', $string); ?>

答案 2 :(得分:1)

我用来避免贪婪的正则表达式的习惯用法是使用与外壳相反的搜索模式(如果某些内容应该用引号括起来,那就是[^"])。对于前卫边缘案例更可靠:

  /content="([^"]*)"/i

答案 3 :(得分:0)

/(?:。)name \ =“description”content \ =“ - &gt;(。)&lt; - 这就是你不想要的额外东西的匹配/没想到会匹配。

/(?:。)name \ =“description”content \ =“(。) - &gt;”&lt; - 这就是“all”之后的引号匹配

你希望正则表达式更快地停止匹配 而不是更晚,因此需要将它置于非贪婪的操作模式(其他海报已经说过)。