XSLT调用str_contains等PHP函数实现字符串模式匹配问题咨询
问题原因排查
1. 版本兼容性问题
str_contains是PHP 8.0新增的系统函数,若服务器运行PHP 7.x及更低版本,该函数不存在,调用会直接失效,你可以通过输出phpinfo()确认当前服务器的PHP版本。
2. 语法&参数逻辑错误
- 你的参数顺序完全写反了:PHP所有字符串查找类函数的参数顺序都是待搜索的目标字符串(haystack)在前,要匹配的子串(needle)在后。你现有代码的逻辑是判断固定字符串
Written by中是否包含评论内容,和你的需求完全相反,哪怕版本正确也不可能匹配成功。 - 额外需要确认:你在PHP中实例化XSLT处理器时,是否调用了
$xsltProcessor->registerPHPFunctions()方法开启PHP函数调用权限,未开启的情况下所有php:function调用都会被忽略。
兼容全版本的实现方案
需求1:判断评论内容包含指定子串
使用PHP全版本兼容的strpos函数,注意要使用强不等判断避免子串出现在开头时返回0被误判为假:
<!-- in a loop --> <xsl:choose> <xsl:when test="php:functionString('strpos', comment, 'Written by') !== false"> <xsl:value-of select="comment"/> </xsl:when> </xsl:choose>
需求2:判断评论内容以指定子串开头
可以用strncmp函数(只对比前N个字符,性能更高),N取你要匹配的前缀字符串的长度即可:
<!-- 匹配以"Written by."开头的评论,前缀长度为11 --> <xsl:choose> <xsl:when test="php:functionString('strncmp', comment, 'Written by.', 11) = 0"> <xsl:value-of select="comment"/> </xsl:when> </xsl:choose>
内容的提问来源于stack exchange,提问作者User970008
相关产品推荐
相关产品推荐

