Php 代码点火器预更换

Php 代码点火器预更换,php,regex,codeigniter,preg-replace,regex-group,Php,Regex,Codeigniter,Preg Replace,Regex Group,我不确定这个问题是我的错还是CI的错。我有一个preg_replace过程将已发布的gdoc电子表格url转换回原始电子表格url $pat ='/(^[a-z\/\.\:]*?sheet\/)(pub)([a-zA-Z0-9\=\?]*)(\&output\=html)/'; $rep ='$1ccc$3#gid=0'; $theoriginal = preg_replace( $pat, $rep, $published ); 这在本地运行的测试页面中工作良好。这个测试页面不是由

我不确定这个问题是我的错还是CI的错。我有一个preg_replace过程将已发布的gdoc电子表格url转换回原始电子表格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还是我的“坏”引起的?是否有易于实施的补救措施

下面是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);


您找到的图案可以稍微“整理”一下:

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

前导的
^
和尾随的
$
通常不放在组内。如果使用的是除
/
以外的正则表达式分隔符,则
/
可以保留为不可替换。A
&
=
不是特殊的正则表达式元字符,
=
在正向环视结构中只是“特殊的”。所以,你的模式意味着:

  • ^
    -字符串锚点的开始
  • (.*sheet/)
    -第1组:除换行符以外的任何0+字符,尽可能少(因为我相信这一点是只匹配URL路径中的
    pub
    ,而不是查询字符串,所以实际上需要将
    *?
    替换为
    [^?]*?
    否定字符类匹配0+字符,而不是
    ),直到第一次出现
    工作表/
    和后续子模式
  • pub
    -子字符串
  • (.*)
    -第2组:除换行字符外的任何0+字符,尽可能多,直到最后一次出现后续子模式
  • (&[a-z=]*)
    -第3组:a
    &
    后跟0个或更多ASCII字母(由于使用了
    i
    修饰符,
    [a-z]
    模式也将匹配大写字母)和/或
    =
  • $
    -字符串结束锚定
在我看来,您也可以使用更好的模式,如

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

看。上述说明中提供了有关更改的说明。

您找到的模式可以稍微“整理”一下:

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

前导的
^
和尾随的
$
通常不放在组内。如果使用的是除
/
以外的正则表达式分隔符,则
/
可以保留为不可替换。A
&
=
不是特殊的正则表达式元字符,
=
在正向环视结构中只是“特殊的”。所以,你的模式意味着:

  • ^
    -字符串锚点的开始
  • (.*sheet/)
    -第1组:除换行符以外的任何0+字符,尽可能少(因为我相信这一点是只匹配URL路径中的
    pub
    ,而不是查询字符串,所以实际上需要将
    *?
    替换为
    [^?]*?
    否定字符类匹配0+字符,而不是
    ),直到第一次出现
    工作表/
    和后续子模式
  • pub
    -子字符串
  • (.*)
    -第2组:除换行字符外的任何0+字符,尽可能多,直到最后一次出现后续子模式
  • (&[a-z=]*)
    -第3组:a
    &
    后跟0个或更多ASCII字母(由于使用了
    i
    修饰符,
    [a-z]
    模式也将匹配大写字母)和/或
    =
  • $
    -字符串结束锚定
在我看来,您也可以使用更好的模式,如

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

看。上述说明中提供了更改的说明。

是否可能是CI允许的URI字符?我不确定你是如何访问文件的,等等。。。但是检查一下。那么它不是CI,变量转储为每个变量显示了什么?变量转储显示preg\u替换的效果完全没有:$TheSignal===$published。好吧,这只是一个CI视图页面,上面有一段代码:它没有什么特别之处,而且很长。我已经解决了。我研究了这个模式来简化它。这是跛脚透似乎在当地工作。我把它修剪了一下,发现它在家里和野外都能发挥作用。谢谢你的意见。这不是一个很好的问题,但它仍然教会了我一些东西。它可能是CI允许的URI字符吗?我不确定你是如何访问文件的,等等。。。但是检查一下。那么它不是CI,变量转储为每个变量显示了什么?变量转储显示preg\u替换的效果完全没有:$TheSignal===$published。好吧,这只是一个CI视图页面,上面有一段代码:它没有什么特别之处,而且很长。我已经解决了。我研究了这个模式来简化它。这是跛脚透似乎在当地工作。我把它修剪了一下,发现它在家里和野外都能发挥作用。谢谢你的意见。这不是一个好问题,但它还是教会了我一些东西。