簡體   English   中英

的preg_match。 /或\\在PHP中

[英]preg_match for . / or \ in PHP

我正在嘗試比賽。 \\或/在PHP中使用preg_match。

我以為這樣可以,但是它匹配所有字符串。

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

您的if邏輯有缺陷。 preg_match將返回匹配數目。 因此, == 0表示“沒有匹配項”。

也就是說, 單引號字符串不會擴展\\'\\\\以外的轉義序列。 您需要將反斜杠轉義加倍,以使其按預期出現在正則表達式中。 將您的代碼更改為:

$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);
    }
}

preg_match()參數是字符串。 字符串由PHP自動轉義。 例如,如果為正則表達式引擎提供了{\\\\\\\\} (反斜杠),PHP將首先對其進行解析,以創建{\\\\}\\\\\\替換)。

接下來,regexp引擎解析regexp。 它看到了PHP給正則表達式引擎的{\\\\} 它將\\視為轉義字符,因此它實際上與\\所轉義的\\字符匹配。

在您的情況下,它看起來像/(\\.|\\\\|\\/)/ PHP提供給regexp引擎/(\\.|\\|\\/)/實際上是. |/ (注意|字符已轉義)。

就個人而言,我嘗試避免轉義元字符,尤其是正則表達式引擎的工作方式。 我通常使用[.]代替,它更具可讀性。 用此代碼編寫的正則表達式類似於/([.]|\\\\\\\\|[/])/

可以進行少量優化。 雖然這是我個人的事,但我更喜歡使用{}作為分隔符(是的,可以使用成對的字符)。 另外,您的正則表達式匹配單個字符,因此您可以輕松地將其寫為{[.\\\\\\\\/]} ,在我看來,這非常可讀(請注意四個斜杠,因為PHP和regexp引擎都解析反斜杠,所以需要它)。

另外, preg_match()返回匹配數目。 它總是大於0 ,因此您可以輕松地將其視為布爾值,並避免寫== 0 相反,您可以插入! 在字符串之前使其變為負數。 但我認為您不小心扭轉了狀況(如果不匹配則匹配)。 有效代碼如下:

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

這個問題可能與PHP有關。 當在正則表達式字符串中轉義某些內容時,還需要轉義用於轉義的反斜杠,否則PHP將嘗試將其解釋為特殊字符。

可能沒有意義,舉個例子。

$string = "\\." 將使PHP嘗試轉義。並失敗。 相反,您需要將其更改為$string = "\\\\\\."

嘗試正則表達式匹配斜杠時,我強烈建議使用不同於'/'的分隔符。 它減少了您需要進行的轉義操作的數量,並使它更具可讀性:

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

嘗試這個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM