Codeigniter preg_replace - PullRequest
       14

Codeigniter preg_replace

1 голос
/ 01 апреля 2012

Я не уверен, является ли эта проблема бу-бу с моей стороны или что-то в отношении КИ.У меня есть процесс preg_replace для преобразования URL-адреса опубликованной электронной таблицы gdoc обратно в исходный URL-адрес электронной таблицы.

$pat ='/(^[a-z\/\.\:]*?sheet\/)(pub)([a-zA-Z0-9\=\?]*)(\&output\=html)/';
$rep ='$1ccc$3#gid=0';

$theoriginal = preg_replace( $pat, $rep, $published );

Это прекрасно работает на тестовой странице, запускаемой локально.Эта тестовая страница не создана CI - это просто базовая страница php.

Когда я копирую и вставляю шаблон и замену в представление CI, для которого он предназначен, радости нет.

Эта неисправность вызвана КИ или моим "плохим"?Существуют ли простые в реализации средства?

Вот немного больше кода из представления CI:

    <body id="sites" >

<?php 

foreach ( $dets as $item )
{
    $nona = $item->nona;
    $address = $item->address;
    $town = $item->town;
    $pc = $item->pc;
    $foto1 = $item->foto1;
    $foto1txt = $item->foto1txt;
    $foto2 = $item->foto2;
    $foto2txt = $item->foto2txt;
    $costurl = $item->costurl;
    $sid = $item->sid;
}

//convert published spreadsheet url to gdoc spreadsheet url
$pat ='/(^[a-z\/\.\:]*?sheet\/)(pub)([a-zA-Z0-9\=\?]*)(\&output\=html)/i';
$rep ='$1ccc$3#gid=0';

$spreadsheet = preg_replace( $pat, $rep, $costurl);

Том

1 Ответ

0 голосов
/ 25 июня 2017

Паттерн, к которому вы пришли, можно немного «привести в порядок»:

~^(.*?sheet/)pub(.*)(&[a-z=]*)$~

См. Демо regex .

Ведущий ^ и трейлинг$ обычно не помещаются в группы./ можно оставить без экранирования, если вы используете разделитель регулярных выражений, отличный от /.& и = не являются специальными метасимволами регулярных выражений, = является только "особенным" в конструкциях с положительным внешним видом.Итак, ваш шаблон означает:

  • ^ - начало привязки строки
  • (.*?sheet/) - Группа 1: любые 0+ символов, кроме символов разрыва строки, всего нескольковозможно (и, как я полагаю, смысл в том, чтобы совпадать только с pub в пути URL-адреса, а не с строкой запроса, вам необходимо заменить .*? на [^?#]*? отрицательный класс символов, соответствующий 0+ символам, отличным от # и?), до первого вхождения sheet/ и последующих подшаблонов ...
  • pub - подстрока
  • (.*) - группа 2: любые 0+ символовкроме символов разрыва строки, как можно больше, вплоть до последнего вхождения последующих подшаблонов ...
  • (&[a-z=]*) - Группа 3: a &, за которым следуют 0 или более букв ASCII (так как *Используется модификатор 1038 *, шаблон [a-z] также будет соответствовать заглавным буквам) и / или =
  • $ - конец привязки строки.

Кажется,Мне, что вы также можете использовать лучший шаблон, как

~^([^?#]*?sheet/)pub(.*)(&[a-z=]*)$~
   ^^^^^^

См. это регулярное выражение демо .Объяснение изменения приводится в объяснении выше.

...