【问题标题】:PHP preg_replace limit not working?PHP preg_replace 限制不起作用?
【发布时间】:2014-06-15 21:12:44
【问题描述】:

我有一个文件,其中包含几种颜色作为十六进制(即#000 或#ffffff),我试图用@varN 替换它们中的每一个,其中 N 是一个随着每次替换完成而递增的数字。我相信我的代码可以做到这一点,但$count 在放置后总是返回 196,即使我将限制设置为 1,所以计数永远不会超过 1。这会导致无限循环。为什么限制不起作用以及我可以做些什么来获得所需的输出?

$list = file($filepath.$file, FILE_USE_INCLUDE_PATH);
$pattern = "/#((([a-f]|[A-F]|[0-9]){6})|(([a-f]|[A-F]|[0-9]){3}))/";
$replaceVar = "@var";
$replaceNum = 0;
$count = 1;
while($count != 0){ //never ends
    $replacement = $replaceVar.$replaceNum;
    $output = preg_replace($pattern,$replacement,$list,1,$count);
    $replaceNum++;
    echo $replaceNum." ".$count."\n"; //returns $replaceNum and 196
}
file_put_contents($filepath.'/new'.$file,$output,FILE_USE_INCLUDE_PATH);

示例输入文件:

#000000 #111111 #123456 #abcdef #123 #abc

示例输出文件:

@var1 @var2 @var3 @var4 @var5 @var6

【问题讨论】:

  • file 将所有内容放到一个数组中,你最好使用file_get_contents,这里你的$count 不会减少所以有一个无限循环是正常的,$count 是什么?
  • file_get_contents 给了我一个字符串,这意味着我必须知道如何将字符串转换回一个文件,所有换行符都在正确的位置。我了解$count 是对我的$list 进行替换的次数。对于$limit = 1$count 永远不应超过 1。

标签: php preg-replace limits


【解决方案1】:

您不使用 good 函数来执行此操作有几个原因,我建议您改用 preg_replace_callback。示例:

$source = file_get_contents($yourfile);

$pattern = '~#[[:xdigit:]]{3}(?:[[:xdigit:]]{3})?~';
$count = 0;

$output = preg_replace_callback($pattern,
                       function ($m) use (&$count) { return '@var' . ++$count; },
                                $source);

【讨论】:

  • 它有效,但是你的正则表达式给了我一些意想不到的结果。
  • @user2361174:什么样的意外结果?
  • @user2361174:对不起我的错误!十六进制数字不是[:alnum:],而是[:xdigit:]
【解决方案2】:

您总是在$list 上进行替换,但将替换结果写入$output

$output = preg_replace($pattern,$replacement,$list,1,$count);

这意味着,当 $list1 开头时,您的 $list 将始终包含 1 匹配项 - 它从未被修改过。因此,您的 while 将无休止地运行。您必须将其替换在您正在扫描的相同字符串中以获取更多命中:

$list = preg_replace($pattern,$replacement,$list,1,$count);

现在 - 在某一时刻 - $count 应该变为零,并且 $list 不再包含不需要的匹配项。

【讨论】:

  • 循环停止了,但它总是使用@var0 作为替换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多