Значение специальных символов в Regex - PullRequest
0 голосов
/ 22 октября 2011

Я копаю codeigniter уже несколько часов.Я нашел несколько других регулярных выражений в классе маршрутизатора.

preg_match('#^'.$key.'$#', $uri);
preg_replace('#^'.$key.'$#', $val, $uri);

Я сделал тестовый файл php, как показано ниже:

<?php

$route['login'] = 'user/login';
$route['user/([a-zA-Z-]+)'] = 'user/profile/$1';

$uri = 'user/asfd';

foreach ($route as $key => $val)
{
    if (preg_match('#^'.$key.'$#', $uri))
    {
        echo preg_replace('#^'.$key.'$#', $val, $uri);
    }
}

он правильно дает

user/profile/asfd

Что яне получить здесь использование # ^ и $ #.Я просканировал сеть, чтобы найти какое-то объяснение, но не повезло.

Ответы [ 2 ]

5 голосов
/ 22 октября 2011

В этом случае начало и конец # являются разделителями регулярного выражения.Вы, вероятно, видели их раньше как /, но можно использовать много разных символов.Они просто обозначают начало и конец шаблона регулярных выражений и могут сопровождаться дополнительными параметрами регулярных выражений, такими как нечувствительность к регистру (i), глобальное соответствие (g) и т. Д. (Хотя вместо 1005 используется preg_match_all()).g флаг в PHP)

Итак, фактический сопоставляемый шаблон равен ^$key$.То есть начало строки для сопоставления, значение $key и конец строки.

Вероятная причина выбора # вместо / в качестве разделителей в этом выражении заключается в том, что он устраняет необходимость экранирования косой черты шаблона URI с помощью \.

2 голосов
/ 22 октября 2011

Они разделители регулярных выражений , как объяснено в руководстве по PHP. Функции preg_ * взяты из библиотеки PCRE (Perl-совместимое регулярное выражение). Perl поддерживает литеральные регулярные выражения, используя разделители регулярных выражений, подобно тому, как строки используют одинарные и двойные кавычки. PHP не поддерживает литеральные регулярные выражения, но библиотека по-прежнему требует разделителей.

...