preg_quote () ошибка или странное поведение? - PullRequest
0 голосов
/ 30 октября 2019

Я использовал preg_quote () для экранирования некоторых специальных символов. Но в тесте, приведенном ниже, есть кое-что, чего я не могу понять.

Почему «дата: 1111aaa» не соответствует ???

<?php
$PregArray = ['date:1111aaa', ':222aaa', '@odia tvled'];


$array['attract (step-date:1111aaa)'] = 'OK';
$array['type (step-date:222aaa)'] = 'OK';
$array['@odia tvled'] = 'OK';


foreach ($PregArray as $key_1 => $val_1) {
    echo "\n--------------";
    foreach ($array as $key_2 => $val_2) {
        if (preg_match("~$val_1~", preg_quote($key_2))) {
            echo "\nOK => $val_1 - ".preg_quote($key_2);
            break;
            }
        else {
            echo "\nNOK !!! => $val_1 - ".preg_quote($key_2);
            }
        }
    }

http://sandbox.onlinephpfunctions.com/code/9ef36e2b010ac1f4f0eaf08881004892bd0cd9c4

1 Ответ

0 голосов
/ 30 октября 2019

Вы используете preg_quote не в том месте, оно предназначено для экранирования символов в шаблоне, а не в тестовой строке (см. руководство ). Измените свой код на этот, и он прекрасно работает:

foreach ($PregArray as $key_1 => $val_1) {
    echo "\n--------------";
    foreach ($array as $key_2 => $val_2) {
        if (preg_match('~' . preg_quote($val_1) . '~', $key_2)) {
            echo "\nOK => $val_1 - $key_2";
            break;
            }
        else {
            echo "\nNOK !!! => $val_1 - $key_2";
            }
        }
    }

Вывод:

--------------
OK => date:1111aaa - attract (step-date:1111aaa)
--------------
NOK !!! => :222aaa - attract (step-date:1111aaa)
OK => :222aaa - type (step-date:222aaa)
--------------
NOK !!! => @odia tvled - attract (step-date:1111aaa)
NOK !!! => @odia tvled - type (step-date:222aaa)
OK => @odia tvled - @odia tvled

Демонстрация на 3v4l.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...