【问题标题】:PHP Preg_replace and Call of Duty Colour IssuePHP Preg_replace 和使命召唤颜色问题
【发布时间】:2014-07-28 13:57:50
【问题描述】:

使命召唤和地震游戏使用 ^0 到 ^1 形式的代码来定义名称(字符串)中的颜色。我正在开发一个自定义 Web RCON 脚本,并且在将 ^0 ~ ^9 替换为 HTML 颜色以进行输出时遇到问题

我正在尝试替换例如 PHP 中的以下内容

字符串已生成,看起来类似于 Lets Say eg。

^3THE^7::^5现代战争^7::^3服务器

我为此使用了 2 个数组

$find = array(  
    '/\^0(.*?)\^/',
    '/\^1(.*?)\^/',
    '/\^2(.*?)\^/',
    '/\^3(.*?)\^/',
    '/\^4(.*?)\^/',
    '/\^5(.*?)\^/',
    '/\^6(.*?)\^/',
    '/\^7(.*?)\^/',
    '/\^8(.*?)\^/',
    '/\^9(.*?)\^/',
    );              
    $replace = array(
    '<font color="#000000">$1</font>^',
    '<font color="#F65A5A">$1</font>^',
    '<font color="#00F100">$1</font>^',
    '<font color="#EFEE04">$1</font>^',
    '<font color="#0F04E8">$1</font>^',
    '<font color="#04E8E7">$1</font>^',
    '<font color="#F75AF6">$1</font>^',
    '<font color="#FFFFFF">$1</font>^',
    '<font color="#7E7E7E">$1</font>^',
    '<font color="#6E3C3C">$1</font>^',
    );

    // Just a Random Test String
    $aDemoString = "^3THE^7::^5MODERNWARFARE^7::^3Server^7";

    $namefix     = preg_replace($find, $replace, $aDemoString);

    echo $namefix;

输出仅部分有效,我得到了

<font color="#00F100">THE</font><font color="#FFFFFF">::<font color="#04E8E7">MODERNWARFARE</font></font>^7::<font color="#00F100">Server</font>^7

它打破了关闭&lt;/font&gt;标签

如果我删除一个 ^7 到我得到的字符串的末尾

<font color="#00F100">THE</font><font color="#FFFFFF">::<font color="#04E8E7">MODERNWARFARE</font></font>^7::^2Server

它似乎没有正确替换字符串中的 ^7,并且由于某种原因弄乱了 html &lt;/font&gt; 结束标记,如果我删除最后一个 ^7 则它会破坏最后一个“^2”替换

我的问题是如何让 PHP Preg_replace 正确执行此操作,有什么帮助吗?

【问题讨论】:

  • 一个奇怪的 - 循环 preg_replace 删除第一个“额外”^7

标签: php html regex preg-replace


【解决方案1】:

模式是 ^0STRING^,因此您应该删除末尾的数字,以使所有部分都“工作”(并具有相同的模式)。

所以首先你应该这样做:

$aDemoString = "^3THE^7::^5MODERNWARFARE^7::^3Server^";

这是第一部分,那么您应该确保 ^ 字符不包含在替换中:

$find = array(  
    '/\^0([^\^]+)\^/',
    '/\^1([^\^]+)\^/',
    '/\^2([^\^]+)\^/',
    '/\^3([^\^]+)\^/',
    '/\^4([^\^]+)\^/',
    '/\^5([^\^]+)\^/',
    '/\^6([^\^]+)\^/',
    '/\^7([^\^]+)\^/',
    '/\^8([^\^]+)\^/',
    '/\^9([^\^]+)\^/'
); 

【讨论】:

  • 我不确定这会有什么帮助。它仍然与^7:: 部分不匹配。见this demo
  • 同意,如果我删除末尾的数字,它也会在末尾留下 ^。伙计,这个让我难住了。到目前为止,我已经为此头疼了 3 天。
【解决方案2】:

你可以像这样替换 ^ 而不是

$find = array('/\^3(.*?).\d+/',.........);

$replace = array(
    '<font color="#000000">$1</font>',........);

【讨论】:

  • 这是我所拥有的升级形式。但它仍然没有对 ^7:: 做任何事情来着色白色,我仍然需要在字符串末尾有一个 ^ 才能工作,否则它给我留下了 THE::MODERNWARFARE::^2Server
【解决方案3】:
<?php
$find = array(  
    '/\^0([^^\d]*)/',
    '/\^1([^^\d]*)/',
    '/\^2([^^\d]*)/',
    '/\^3([^^\d]*)/',
    '/\^4([^^\d]*)/',
    '/\^5([^^\d]*)/',
    '/\^6([^^\d]*)/',
    '/\^7([^^\d]*)/',
    '/\^8([^^\d]*)/',
    '/\^9([^^\d]*)/',
    );              
    $replace = array(
    '<font color="#000000">',
    '<font color="#F65A5A">',
    '<font color="#00F100">',
    '<font color="#EFEE04">',
    '<font color="#0F04E8">',
    '<font color="#04E8E7">',
    '<font color="#F75AF6">',
    '<font color="#FFFFFF">',
    '<font color="#7E7E7E">',
    '<font color="#6E3C3C">',
    );


    // Just a Random Test String
    $aDemoString = "^3THE^7::^5MODERNWARFARE^7::^3Server^7";
    preg_match_all('/\^(\d)([^^\d]*)/', $aDemoString, $out);

    print_r($out);
    foreach($out[0] as $key => $val){
      $aDemoString = str_replace($val, $replace[$out[1][$key]].$out[2][$key].'</font>', $aDemoString);
    }


    echo ($aDemoString);
    //<font color="#EFEE04">THE</font><font color="#FFFFFF">::</font><font color="#04E8E7">MODERNWARFARE</font><font color="#FFFFFF">::</font><font color="#EFEE04">Server</font><font color="#FFFFFF"></font>
?>

【讨论】:

  • 我看到这个解决方案有点晚了。但感谢另一种方法。下面来自 Alexander Kononenko 的解决方案正好适合我的主要脚本所做的并且完美地工作。该解决方案也有效。谢谢
【解决方案4】:

试试这个:

$colors = array(
    "#000000",
    "#F65A5A",
    "#00F100",
    "#EFEE04",
    "#0F04E8",
    "#04E8E7",
    "#F75AF6",
    "#FFFFFF",
    "#7E7E7E",
    "#6E3C3C",
);
$find = array(
    '/\^(\d)([^\^]*)/e',
); 
$replace = array(
    '"<font color=\"".$colors["$1"]."\">$2</font>"',
);

// Just a Random Test String
$aDemoString = "^3THE^7::^5MODERN^2WARFARE^7::^3Server^7";

$namefix     = preg_replace($find, $replace, $aDemoString);
echo $namefix."\n";

【讨论】:

  • 这对我有用。谢谢你。每天学习一些东西。多谢你们。现在我可以继续这个项目了。
猜你喜欢
  • 2021-02-02
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
相关资源
最近更新 更多