2010-10-30 76 views
1

我有以下字符串:这个正则表达式有什么问题?

<?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:有代码中没有换行,我只是说他们的可读性...

+1

它试图解析HTML,这就是它的错误。 http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – You 2010-10-30 21:00:05

回答

1

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

<?php echo preg_replace('/(?:.*)name\="description" content\="(.*?)"(?:.*)/i', '$1', $string); ?> 
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]包含你的字符串,如果正则表达式找到匹配。

+0

PS:第一个“(?:。*)”也是无用的; ) – NikiC 2010-10-30 21:08:39

1

我用它来避免贪婪正则表达式的成语是使用搜索模式相反的机箱(即[^"]如果事情是应该用引号括起来)。更可靠的前卫边缘情况:

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

也可能更有效。 – bobince 2010-10-30 21:35:35

0

/- ()(?)名称\ = “说明” 内容\ =“> < - 这是什么多余的东西匹配您不想/没想到匹配

/(:?)名称\ = “说明” 内容\ = “() - >” < - 这是报价后所匹配。单词'all'

你想要正则表达式停止匹配更快宁而不是后来,因此需要把它变成一种不贪婪的操作模式(其他海报说过)。

相关问题