2015-09-25 31 views
1

現在測試似乎是爲了避免我不想要的字符而工作,但它只返回2的數字。我知道爲什麼,我只是不知道如何解決它。問題是最後一個?被排除在外,因爲第二場比賽的實際比賽是(?+,所以它與第三場比賽不匹配,因爲該模式沒有「開始」字符,它只是?)PHP preg_match_all沒有字符或不是某個字符

$pattern = "/([^\w\d'\"`]\?[^\w\d'\"`])/"; 
$subject = "`test` = ? and `other` = (?+?)"; 
$count = preg_match_all($pattern, $subject, $matches); 
echo "Count: $count\n"; // echoes 2 instead of 3 

基本上,我想計數使用的所有參數,因此匹配在$subject所有??不是由字母,數字,引號括起來,和蜱。

這是一個重要的實際模式:

[^\w\d'\"'`] 

更新: 對於其他人來說,miken32的解決方案是,以上述模式轉換爲:

(?=[^\w\d'\"'`]) 
+0

您是否只想匹配'?',因爲現在您的匹配不止於此。 –

+0

@ l'l是的,只有?的。這用於分析參數化查詢。 – Devon

+0

你也是匹配'\ s','(','+'太...如果你只想匹配'?'而沒有別的,我想你可以用'(?= [^ \ w \ d'\「\'])\?'。第二個你似乎沒有必要。 –

回答

1

嘗試使用lookahead assertion

$pattern = "/((?<=[^\w\d'\"`])\?(?=[^\w\d'\"`]))/"; 

它將向前看,而不會向前移動搜索。

編輯以添加lookbehind斷言。

+0

看起來我應該在雙方都做到這一點,但這似乎是一個完美的結合,謝謝。我會很快接受它,除非有人提起你:) – Devon

+0

爲什麼不只是做'(?:[^ \ w \ d'\'\'])\?',或'(?= [^ \ w \ d' \「\'])\?' –

相關問題