PHP explode无法处理从EECMS模板获取的字符串

PHP explode无法处理从EECMS模板获取的字符串,php,expressionengine,explode,Php,Expressionengine,Explode,我正在用PHP构建一个ExpressionEngine模块 在ExpressionEngine中,可以通过以下方式访问模板中传递给模块的参数: $my_param=$this->EE->TMPL->fetch_param('my_param') 但是,当我以这种方式获取字符串时,explode对其不起作用: public function get_tyres() { $tyres = $this->EE->TMPL->fetch_param('tyres');

我正在用PHP构建一个ExpressionEngine模块

在ExpressionEngine中,可以通过以下方式访问模板中传递给模块的参数:
$my_param=$this->EE->TMPL->fetch_param('my_param')

但是,当我以这种方式获取字符串时,explode对其不起作用:

public function get_tyres()
{
    $tyres = $this->EE->TMPL->fetch_param('tyres');
    echo($tyres);
    // this shows: '205/55R16M+S|205/55R16|205/55R16'
    // now I want to split it into single tyres, using the pipe as a delimiter

    $tyre_array = explode("|", $tyres);
    foreach($tyre_array as $tyre)
    {
        echo($tyre . '<br>');
    }
    // the above produces: '205/55R16M+S|205/55R16|205/55R16',        
    // where I'd expect it to produce:
    // 205/55R16M+S
    // 205/55R16
    // 205/55R16

}
它返回<代码>{,v,e,r,s,i,o,n,:,t,y,r,e,s,},
,这实际上是在HTML模板中传递给PHP的变量:

{exp:my_module:tyres tyres="{version:tyres}"}
<h1>{tyre:name}</h1>
... more irrelevant HTML
{/exp:my_module:tyres}

现在我将研究ExpressionEngine解析顺序。如果有人知道如何解决这个问题,我很乐意知道;-)

我测试了您的代码,复制并粘贴了您的测试字符串,对我来说效果很好。确保你的管道(“|”)真的是你认为它是的字符,而不是,比如说,一些疯狂的unicode东西,看起来像管道,但实际上是“staff”的克林贡语或其他东西

尝试这样的方法来检查现实:

echo " the pipe is at " .strpos($tyres,"|"). " and I really hope this it says '12'";

答案在于ExpressionEngine解析顺序,如下所述:

由于模板标记{exp:my_module:tires}使用了嵌套在其中的模板标记传递给它的变量,因此尚未解析该变量,因为首先解析最里面的标记

将参数
parse=“intrown”
添加到外部模板标记会使ExpressionEngine首先解析该标记,并将正确的变量传递给内部模板标记


有关更改解析顺序的详细信息,请参阅。

您确定字符串中的
实际上与您输入的
相同吗?可能是一些完全不同的unicode字符,恰好看起来相同。它应该可以工作。检查示例:问得好,但我确信,因为当我将分解定界符更改为,例如
0
R
M
,它们都存在于字符串中时,分解仍然返回一个数组,其中包含一项:整个字符串,未爆炸。
echo htmlentities($tires)或回声的视图源如果在渲染的浏览器视图中查看,可能是字符串不包含您认为它包含的内容。也就是说,ExpressionEngine并没有将管道编码成不同的代码,所以您的代码应该可以工作。请尝试使用var_dump而不是echo。它将为您提供有关$tires的类型和内容的更多信息。是的,这样做很好。当我硬编码字符串时,它就工作了。从模板中提取时,它不起作用。可能是模板以某种方式对字符串进行编码吗?可能是的,这就是为什么我建议在上面插入现实检查代码,只是把函数放在某个地方。对我来说是“12”,我猜对你来说是“假/空白”。如果是这样的话,你至少可以缩小问题的范围,找出你真正需要的是什么。您的管道位于位置12,因此您可以尝试以下操作:echo“
位置12处的字符是(“.substr($tires,12,1)。”);考虑到你现在已经提到你得到了相同的问题I0、r或M,然后尝试上面的substr方法,然后将结果复制并粘贴回你的“explode”中。如果这不起作用,开始研究如何获得准确的字符代码,至少在其他语言中,有时是需要的。我没有必要在PHP中这样做。尝试从这里开始:
array (size=2)
  0 => string '{version' (length=8)
  1 => string 'tyres}' (length=6)
echo " the pipe is at " .strpos($tyres,"|"). " and I really hope this it says '12'";