【问题标题】:Codeigniter preg_replaceCodeigniter preg_replace
【发布时间】:2012-04-01 13:16:14
【问题描述】:

我不确定这个问题是我的嘘声还是与 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);

汤姆

【问题讨论】:

  • 可能是 CI 允许的 URI 字符吗?我不确定你是如何访问文件的,等等……但请检查一下。
  • 那不是CI,var_dump对每个变量显示什么?
  • var_dump 显示 preg_replace 的效果完全没有:$theorignal === $published。齐尔奇。
  • 嗯,这只是一个 CI 视图页面,上面插入了一些代码:没有什么特别之处,而且很长。
  • 我已经解决了。我研究了模式以简化它。似乎在当地工作很蹩脚。我把它修剪下来,发现它在家里和野外都能正常工作。感谢您的输入。不是一个好问题,但它仍然教会了我一些东西。

标签: php regex codeigniter preg-replace regex-group


【解决方案1】:

你得出的模式可以稍微“整理”一下:

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

请参阅regex demo

开头的^ 和结尾的$ 通常不会放在组内。如果您使用除/ 之外的正则表达式分隔符,/ 可以不转义。 &amp;= 不是特殊的正则表达式元字符,= 仅在正向环视结构中是“特殊的”。所以,你的模式意味着:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多