PHP-在无法由用户定义的字符上展开。。。怎样

PHP-在无法由用户定义的字符上展开。。。怎样,php,string,explode,Php,String,Explode,好的,我试图找到一个字符或一组字符,或者可以用来分解的东西,因为文本是用户定义的,所以我需要能够从我拥有的一个值分解,这个值永远不能在文本中 我该怎么做 我正在尝试做的一个例子 $value = 'text|0||#fd9||right'; 嗯 文本在这里永远不应该改变。 0,再次不可更改 fd9是一个用户定义的字符串,可以是用户输入的任何内容。。。 和right设置向左或向右的方向 所以,我面临的问题是:如何分解| |,$值,以便如果用户定义的部分中有一个| |。。。例如: $value =

好的,我试图找到一个字符或一组字符,或者可以用来分解的东西,因为文本是用户定义的,所以我需要能够从我拥有的一个值分解,这个值永远不能在文本中

我该怎么做

我正在尝试做的一个例子

$value = 'text|0||#fd9||right';

文本在这里永远不应该改变。 0,再次不可更改 fd9是一个用户定义的字符串,可以是用户输入的任何内容。。。 和right设置向左或向右的方向

所以,我面临的问题是:如何分解| |,$值,以便如果用户定义的部分中有一个| |。。。例如:

$value = 'text|0||Just some || text in here||right';
因此,如果用户将| |放在字符串的用户定义部分,则会将其搞糟。无论用户在字符串中输入什么,如何执行此操作?因此它应该返回以下数组:

array('text|0', 'Just some || text in here', 'right');
我应该使用不同的字符来爆炸吗?如果是这样,我可以使用什么用户将无法输入到字符串中,或者我如何检查并修复它?在这种情况下,我可能不应该使用| |,但我可以使用什么来修复此问题

此外,值首先来自字符串,然后在保存后来自数据库

有什么想法吗?

编辑:新解决方案

是否保证文本不包含| |本身? 如果没有,您可以将substr与strpos和strrpos结合使用,而不是使用explode

我通常是这样做来解决这个问题的

1捕获用户文本并将其保存在var$user\u text中

2对$user\u文本运行str\u replace以替换要拆分的字符:

//replace with some random string the user would hopefully never enter 
$modified = str_replace('||','{%^#',$user_text);
3现在,您可以使用||

4现在在分解的每个部分上运行str_replace,将其设置回用户输入的原始文本

foreach($parts as &$part) {
    $part = str_replace('{%^#','||',$part);
}

如何将任意数据类型表示为字符串的问题总是与您描述的问题背道而驰,并且已经在许多方面得到了解决。这个过程称为序列化,有许多序列化格式,从PHP本机到XML。所有这些格式都指定了如何将复杂数据结构表示为字符串,包括如何在序列化值本身中使用序列化格式中具有特殊含义的字符的转义规则

从评论中:

好吧,基本上,这是直截了当的。我已经概述了其他13个参数,以及它们在位于此处的Dream Portal中的工作方式:所以,您可以看到它们是如何适应的。我正在研究一个fieldset参数,它基本上使用了所有这些参数,而不是一些将多个参数包含到1中。无论如何,希望这个链接能帮助您了解模块的XML文件是什么样子的:看看info.XML部分,注意下面的标签,其中的两个

在我看来,更合理地使用XML将使这一点变得更容易。我还没有详细阅读全部内容,但是像

<param name="test_param" type="select">0:opt1;opt2;opt3</param>
写出来会更有意义

<select name="test_param">
    <option default>opt1</option>
    <option>opt2</option>
    <option>opt3</option>
</select>

根据需要表示的参数类型,每个唯一配置选项都可以有自己的唯一元素名称空间和自定义子元素。那么就没有必要为每个可能的参数发明一个自定义的迷你格式。它还允许您创建一个正式的文档,这对您是否有好处是另一个主题,但至少您使用的是XML,因为它本来就是要使用的。

您可以将任何用户输入编码到base64,然后将其与explode一起使用,或者按照您的意愿使用

print base64_encode("abcdefghijklmnopqrstuvwxyz1234567890`~!@#$%^&*()_+-=[];,./?>:}{<");
序列化数组也不是一个坏主意。这可能比使用逗号分隔的字符串并分解要好。Drupal很好地利用了序列化数组

请参阅PHP手册,了解如何使用它:


序列化或JSON格式的字符串如何?如果您使用某个内容作为分隔符,如果用户确实希望将其用作内容,则必须提供转义序列,这就是为什么您需要在字符串文本中转义引号的原因。这完全取决于你如何逃避。如果你不这样做,那么你能做的就是猜测,这不是一个好位置。我同意Jared,JSON或序列化肯定是一个更好的方法,那么你就不必担心用户输入的内容会破坏你的代码,或者为分隔符编码并转义。好的,这个值首先来自一个XML文件,因为它安装了一个插件,这个值对于插件的工作是至关重要的,因为它处理插件的参数。但是,软件需要能够对其进行分类,并且不确定JSON或序列化是否有帮助。你能给我指一个你认为可能有用的链接吗?CSV和str_getcsv及其转义规则如何?表示双引号和反斜杠表示其中的分隔符,是,管道也将是有效的分隔符。从技术上讲,这是否
根本没有改进已经是一些用户希望永远不会输入的随机字符串。您只是在使用一些用户希望永远不会输入的随机字符串进行循环。是否可以保证文本本身不包含| |本身?不,这正是问题所在。我的意思是文本中的文本是你在问题中描述的永远不应该改变的东西,而不是用户输入的部分。抱歉搞混了。我该如何序列化它呢?整个字符串是否应序列化和取消序列化?还是仅仅是用户定义的值?如果序列化,这在设置起始值的XML文件中有什么帮助?@SoLoGHoST-请参见这里的示例。我不确定的是,为什么数据来自一个XML文件,然后进入一个变量,该变量以字符串格式存储数组,然后在脚本中转换回数组。为什么要将中间步骤设置为分隔字符串?@solo如果您是从一个要创建的XML文件中获取此内容,请正确使用XML。不要在XML元素中存储一些自定义的不明确内容,而是在单独的XML元素中存储单独的值。这正是XML的用途。text0fd9@solo在我看来,如果您的系统非常复杂,一个简单的数据格式序列化问题需要几个小时的背景信息才能得到正确的回答,那么您的系统看起来非常糟糕;;