我想匹配。 \或/在PHP中使用preg_match。preg_match for。 /或在PHP
我認爲這樣做,但它匹配所有的字符串。
$string = '';
$chars = '/(\.|\\|\/)/';
if (preg_match($chars, $string) != 0) {
echo 'Chars found.';
}
我想匹配。 \或/在PHP中使用preg_match。preg_match for。 /或在PHP
我認爲這樣做,但它匹配所有的字符串。
$string = '';
$chars = '/(\.|\\|\/)/';
if (preg_match($chars, $string) != 0) {
echo 'Chars found.';
}
參數是字符串。字符串被PHP自動轉義。例如,如果給予正則表達式引擎{\\\\}
(反斜槓),PHP將首先解析它,創建{\\}
(\\
被替換爲\
)。
接下來,正則表達式引擎分析正則表達式。它看到了PHP給正則表達式引擎的{\\}
。它看到\
爲轉義字符,所以它實際上匹配\
字符,它被\
轉義。
就你而言,它看起來像/(\.|\\|\/)/
。 PHP提供了正則表達式引擎/(\.|\|\/)/
,它實際上是.
或|/
(注意|
字符已被轉義)。
就個人而言,我儘量避免轉義元字符,特別是如何使用正則表達式引擎工作。我通常使用[.]
代替,它更具可讀性。你用這個寫的正則表達式看起來像/([.]|\\\\|[/])/
。
可以做一些優化。雖然這是我個人的事情,但我更願意使用{}
作爲分隔符(是的,您可以使用字符對)。此外,你的正則表達式匹配單個字符,所以你可以很容易地將它寫成{[.\\\\/]}
,這在我看來是非常可讀的(注意四個斜槓,因爲PHP和正則表達式引擎都解析反斜槓,所以需要它。
另外,preg_match()
返回匹配數。它總是大於0
,所以你可以很容易地認爲它是布爾值,並避免寫入== 0
。相反,您可以在字符串之前插入!
以使其爲負數。但我認爲你意外地扭轉了條件(如果它不匹配,則匹配)。以下有效代碼:
$string = '';
$chars = '{[.\\\\/]}';
if (preg_match($chars, $string)) {
echo 'Chars found.';
}
完美!謝謝! –
這個問題可能與PHP。在正則表達式字符串中轉義某些東西時,還需要轉義用於轉義的反斜槓,否則PHP將嘗試將其解釋爲特殊字符。
因爲這可能沒有道理,所以舉個例子。
$string = "\."
會使PHP試圖逃避,並失敗。您需要將其更改爲$string = "\\\."
。
不使用單引號。 – knittl
噢,是的,我忘記了。 – slugonamission
您的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);
}
}
啊,我已經更新了我的代碼。在我的例子中,這只是一個錯字。問題依然存在。 –
當嘗試正則表達式匹配斜線,我會強烈建議使用一個不同的分隔符不是「/」。它減少了逃避,你需要做的量,並使其更具可讀性:
$chars = '%(\.|\\|/)%';
良好的通話,但它仍然匹配一切。 –
試試這個:給preg_match()
$chars = '%(\.|\\\\|/)%'
你試過了嗎?你有錯誤嗎? –
一切都匹配,不僅僅是帶有。\或/的字符串。我沒有收到錯誤。 –