2011-11-13 94 views
1

我想匹配。 \或/在PHP中使用preg_match。preg_match for。 /或在PHP

我認爲這樣做,但它匹配所有的字符串。

$string = ''; 
$chars = '/(\.|\\|\/)/'; 
if (preg_match($chars, $string) != 0) { 
    echo 'Chars found.'; 
} 
+0

你試過了嗎?你有錯誤嗎? –

+0

一切都匹配,不僅僅是帶有。\或/的字符串。我沒有收到錯誤。 –

回答

3

參數是字符串。字符串被PHP自動轉義。例如,如果給予正則表達式引擎{\\\\}(反斜槓),PHP將首先解析它,創建{\\}\\被替換爲\)。

接下來,正則表達式引擎分析正則表達式。它看到了PHP給正則表達式引擎的{\\}。它看到\爲轉義字符,所以它實際上匹配\字符,它被\轉義。

就你而言,它看起來像/(\.|\\|\/)/。 PHP提供了正則表達式引擎/(\.|\|\/)/,它實際上是.|/(注意|字符已被轉義)。

就個人而言,我儘量避免轉義元字符,特別是如何使用正則表達式引擎工作。我通常使用[.]代替,它更具可讀性。你用這個寫的正則表達式看起來像/([.]|\\\\|[/])/

可以做一些優化。雖然這是我個人的事情,但我更願意使用{}作爲分隔符(是的,您可以使用字符對)。此外,你的正則表達式匹配單個字符,所以你可以很容易地將它寫成{[.\\\\/]},這在我看來是非常可讀的(注意四個斜槓,因爲PHP和正則表達式引擎都解析反斜槓,所以需要它。

另外,preg_match()返回匹配數。它總是大於0,所以你可以很容易地認爲它是布爾值,並避免寫入== 0。相反,您可以在字符串之前插入!以使其爲負數。但我認爲你意外地扭轉了條件(如果它不匹配,則匹配)。以下有效代碼:

$string = ''; 
$chars = '{[.\\\\/]}'; 
if (preg_match($chars, $string)) { 
    echo 'Chars found.'; 
} 
+0

完美!謝謝! –

1

這個問題可能與PHP。在正則表達式字符串中轉義某些東西時,還需要轉義用於轉義的反斜槓,否則PHP將嘗試將其解釋爲特殊字符。

因爲這可能沒有道理,所以舉個例子。

$string = "\."會使PHP試圖逃避,並失敗。您需要將其更改爲$string = "\\\."

+2

不使用單引號。 – knittl

+0

噢,是的,我忘記了。 – slugonamission

3

您的if邏輯有缺陷。 preg_match將返回匹配的數量。因此,== 0表示「不匹配」。

也就是說,single quoted strings不擴大轉義序列,除了\'\\。您需要將反斜槓轉義加倍,以便按預期顯示在正則表達式中。你的代碼更改爲:

$string = ''; 
$chars = '/(\.|\\\\|\/)/'; 
if (preg_match($chars, $string) != 0) { 
    echo 'Chars found.'; 
} 

這是一個測試案例:

$strings = array('', '.', '/', '\\', 'abc'); 
$pattern= '/(\.|\\\\|\/)/' 

foreach($strings as $string) { 
    if (preg_match($pattern, $string) > 0) { 
     printf('String "%s" matched!', $string); 
    } 
} 
+0

啊,我已經更新了我的代碼。在我的例子中,這只是一個錯字。問題依然存在。 –

0

當嘗試正則表達式匹配斜線,我會強烈建議使用一個不同的分隔符不是「/」。它減少了逃避,你需要做的量,並使其更具可讀性:

$chars = '%(\.|\\|/)%'; 
+0

良好的通話,但它仍然匹配一切。 –

0

試試這個:給preg_match()

$chars = '%(\.|\\\\|/)%'