Отказ от ответственности: если я не вижу, это не то же самое, что описано в Эта тема и мне нужно некоторое время, чтобы полностью объяснить ситуацию.
Очень давно я задал вопрос о том, как использовать оператор REGEXP в операторе SQLite. Оператор не реализован по умолчанию, но может быть во время выполнения.
Хорошо .. Как вы можете видеть по датам, которые работали на меня годами. Не совсем с помощью этой темы (кто-то из списка рассылки SQLite показал мне хитрость), но это сработало хорошо.
Поскольку preg_match () работает иначе, чем ereg () (как я слышал), возвращая положительно сразу после первого совпадения, я принял дополнительные меры предосторожности, прежде чем заполнять эту базу данных SQLite путем сортировки REGEXES (я уверен, что это не форма множественного числа справа) от самой длинной (более конкретной) до самой короткой (более общей).
Ничего страшного, просто простой uasort () с использованием strlen ().
Рассматривая вымышленный каталог управления фильмами с двумя URL-адресами, такими как management/actors
а также management/actors/add
этот трюк сортировки избавил меня от ложных срабатываний при доступе к первому URL, а SQLite отвечал вторым ResultSet только потому, что оба они имеют одинаковую неизменную часть management/actors
Это текущая реализация:
$this -> dbh
-> sqliteCreateFunction(
'REGEXP',
function( $r, $s ) {
return ( preg_match( sprintf( '@^%s$@i', $r ), $s ) != 0 );
},
2
);
бытие $ this -> dbh свойство класса с используемым экземпляром PDO.
Ситуация теперь другая, потому что этот прием сортировки не рассматривал одну возможность: два маршрута, где самый общий также самый длинный маршрут. Например: management/actors/add
а также management/actors/overview
,
Концептуально, второй маршрут является более общим, потому что он ссылается на простую информационную панель со списком всех действующих лиц и должен идти вниз. На самом деле это просто псевдоним для management/actors
,
И второй маршрут более конкретен, потому что он направляет форму, ответственную за добавление новой записи, и поэтому должен идти наверх
Эти маршруты анализируются из комментариев к документам PHP, распределенных по классам контроллера, например:
/**
* Overview
*
* !Route GET, management/actors
* !Route GET, management/actors/overview
*/
final public function overview() {}
/**
* Add
*
* !Route GET, management/actors/add
*/
final public function add() {}
И приходит в таком порядке:
management/actors
management/actors/overview
management/actors/add
Поскольку мне нужно идентифицировать метод Action, они структурируются в разных индексах массива с именем метода класса в качестве ключа:
Array(
'overview' => array(
[0] => management/actors
[1] => management/actors/overview
),
'add' => array(
[0] => 'management/actors/add'
)
)
Как я уже сказал, сортировка работает и может сделать эту структуру:
Array(
'overview' => array(
[0] => management/actors/overview
[1] => management/actors
),
'add' => array(
[0] => 'management/actors/add'
)
)
Но весь компонент не работает из-за preg_match () реализации оператора SQLite REGEX.
До сих пор единственным способом, которым мне удалось обойти эту проблему, была разработка классов Controller следующим образом:
/**
* Add
*
* !Route GET, management/projects/add
*/
final public function add() {}
/**
* Overview
*
* !Route GET, management/projects
* !Route GET, management/projects/overview
*/
final public function overview() {}
Я имею в виду, в обратном порядке.
Отлично! Все приложения определенным образом имеют свои странности, и я мог бы с этим смириться, но, возможно, в будущем кто-то другой может открыть этот код и оказать ему некоторую поддержку и может не знать об этом ограничении.
Тем не менее, (наконец) я хотел бы знать, есть ли способ увеличить обжорство preg_match () и сделать так, чтобы он не останавливался в первом положительном событии и соответствовал как можно дольше, как это делает Эрег, или, по крайней мере, я думаю, что да, я Я никогда не видел это в действии.
Или альтернативное решение, конечно: p
Как было запрошено в комментариях, некоторые примеры REGEXES перечислены в порядке их добавления в базу данных SQLite (после сортировки):
management/projects/overview\b(.*?)
management/projects/add\b(.*?)
management/projects\b(.*?)
Они очень простые РЕГЕКЦЫ. Они соответствуют в основном URI запроса. В конце REGEX у меня есть только граница, чтобы отличить фиксированный текст строки от переменной части, которая может быть существует (как аргумент GET для профилирования Xdebug)
Задача ещё не решена.
Других решений пока нет …