2010-10-30 77 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'

你想要正則表達式停止匹配更快寧而不是後來,因此需要把它變成一種不貪婪的操作模式(其他海報說過)。

相關問題