2017-03-14 28 views
-1
<?php 
$regex = '<p>ttt<p>'; 

if (preg_match('#<p>[a-z]<p>#i', $regex, $result)) 
{ 
    echo 'True'; 
    echo $result[0]; 
} 
else 
{ 
    echo 'False'; 
} 

?> 

基本上,這段代碼給了我False。但是,如果我用[a-z]*代替[a-z],則該代碼給我提供了真實性。我需要關於正則表達式php的幫助

或者,如果我繼續[a-z]沒有*,但我在preg_match刪除<p><p>,代碼給我正確的。

老實說,我不明白爲什麼第一個給我虛假和其他人是真實的。任何人都能解釋我爲什麼?

+3

'ragex' - 一個憤怒的正則表達式? –

回答

2

[a-z]是,不管信不信,都認爲是一個字符。就像我把[ab]一樣,那也是「一個字符」。 [a-z]意味着該字符可以是任何字母:abcdefghijklmnopqrstuvwxyz。當我們添加[a-z]*時,我們現在允許[a-z]的一個字符有0個或更多的重複。

<?php 
$regex = '<p>ttt<p>'; 

if (preg_match('#<p>[a-z]*<p>#i', $regex, $result)) 
{ 
    echo 'True'; 
    echo $result[0]; 
} 
else 
{ 
    echo 'False'; 
} 

?> 

退房這裏的結果:

https://eval.in/753902

+1

哦,很酷。從來沒有想過...更新它。 – Neil

+0

嘿,謝謝你試圖幫助我。我真的很忙。 基本上,「ttt」= 3個字符,對吧? 我仍然不確定爲什麼https://eval.in/759585給我的真實。 – AlexCold

0

[a-z]漁獲只有一個字符,而[a-z]*抓個字符長度高達0到n。

而且你的模式應該由/

/<p>[a-z]*<p>/i 
+0

'#'是一個有效的分隔符。 – chris85

+0

@ chris85,謝謝你提供的信息我不知道這 – lkdhruw

+0

你可以在這裏看到更多,http://php.net/manual/en/regexp.reference.delimiters.php。 '分隔符可以是任何非字母數字,非反斜槓,非空白字符。'某些字符比其他字符更好,取決於字符串。 – chris85

0

我前幾天發佈的另一個問題作爲註釋進行封裝。

我會問作爲後。

如果[a-z]被認爲是一個字符。

<?php 
 
$regex = '<p>ttt<p>'; 
 
    
 
if (preg_match('/<p>[a-z]<p>/i', $regex, $result)) 
 
{ 
 
\t echo 'True'; 
 
\t echo $result[0]; 
 
} 
 
else 
 
{ 
 
\t echo 'False'; 
 
} 
 
    
 
?>

給我假的,因爲 'TTT' 基本上是3個字符,對不對?

然而,

<?php 
 
$regex = '<p>ttt<p>'; 
 
    
 
if (preg_match('/[a-z]/i', $regex, $result)) 
 
{ 
 
\t echo 'True'; 
 
\t echo $result[0]; 
 
} 
 
else 
 
{ 
 
\t echo 'False'; 
 
} 
 
    
 
?>

這個代碼給我真實的,但上面的字符串基本上是9個字符。