PHP explode无法处理从EECMS模板获取的字符串
我正在用PHP构建一个ExpressionEngine模块 在ExpressionEngine中,可以通过以下方式访问模板中传递给模块的参数: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');
$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'";