2012-05-01 93 views
0

這是我到目前爲止有:使用的preg_match搶值

$data = "Hello this is on1"; 
if (preg_match("/n/", $data)){ 
    $status = "it contains n"; 
} 
if (preg_match("/n1/", $data)){ 
    $status1 = "it contains n1"; 
} 
echo $status; 
echo $status1; 

這個會說,$data它包含「N」則是$data包含「N1」 我遇到的問題是,我該怎麼辦單獨抓住「n」。 只有在$data="Hello this contains n"的情況下才返回「它包含n」 用其他術語來說,如果字母「n」附加到別的沒有問題的地方,則不應該附加到任何數字。

回答

1

使用單詞邊界\b和排除模式是這樣的:

if (preg_match("/\b(n(?!\d+)[^\b]*)/", $data)){ 
    $status = "it contains n"; 
} 

\b將確保n與字邊界,因此on1不會匹配匹配。其他2個響應

+0

謝謝,但我指定該字母不應該後跟一個數字 – cppit

+0

哦,對不起,但在你的問題中的文本:'它應該返回「它包含n」只有「否則說或可能只是我的壞解釋。 – anubhava

+1

根據您的評論編輯我的答案。 – anubhava

1

你可以調整你的正則表達式來繞過任意組合「N」後跟一個數字,像這樣:

/n[^\d]/ 

注意\d站在了一個數字,而[^...]語法將匹配任何ISN 't在字符組內。

+0

心不是^意味着它與接下來開始? – cppit

0

半組合:

/\bn\D*/ 
  • \b表示一個字邊界
  • \D表示任何非數字字符
  • *表示0以上occurence(非的-digit chars)

編輯:這裏感謝艾倫是一個更好的版本:

/\bn[^\d\s]*\b/ 
+0

'\ D *'不排除數字,如果有數字,它只會消耗非數字。要說「不跟隨數字」,你需要一個負面的預測:'(?!\ d)' –

+0

你是對的。感謝那。 – inhan