Codeigniter preg_replace

时间:2012-04-01 13:16:14

标签: codeigniter preg-replace

我不确定这个问题是否是我的嘘声或CI的问题。我有一个preg_replace进程将已发布的gdoc电子表格网址转换回原始电子表格网址。

$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);

汤姆

1 个答案:

答案 0 :(得分:0)

你来的模式可以“整理”一下:

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

请参阅regex demo

前导^和尾随$通常不会放在群组中。如果您使用除/之外的正则表达式分隔符,则/可以保留未转义状态。 &=不是特殊的正则表达式元字符,=只是正面外观构造中的“特殊”。所以,你的模式意味着:

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

在我看来,您也可以使用更好的模式,如

$

this regex demo。上述说明中提供了对更改的说明。