我正在Joomla开发一个模块,我需要从$article->text
中删除该片段并提取部件号以将其内容存储在$part_number
中。
{myplugin}ABCDEF1234,"Flux Capacitor"{/myplugin}
我一直在努力解决问题,但我无法让它发挥作用:
$re = '/\{myplugin\}(\w+),[^{}]+\{\/myplugin\}/';
$subst = '';
$result = preg_replace($re, $subst, $article->text);
$article->text = $result;
但是这不会返回部件号,所以我可以将它放在$part_number
中。这可以在一个正则表达式操作中完成,还是应该是一个提取数字号码,另一个是从$article->text
删除片段?
目的是从{myplugin}ABCDEF1234,"Flux Capacitor"{/myplugin}
中删除$article->text
,并将此代码段中的ABCDEF1234
部分编号复制并存储在PHP变量$part_number
中。
答案 0 :(得分:1)
是的,您可以从$article->text
中移除插件子字符串并在一次点击中声明$partnumber
。
代码:(Demo)
$article=(object)['text'=>'Some leading text {myplugin}ABCDEF1234,"Flux Capacitor"{/myplugin} some trailing text'];
$re = '~\{myplugin\}([^,]+),[^{]+\{/myplugin\}~';
$subst = '';
$article->text=preg_replace_callback($re,function($m)use(&$partnumber){ $partnumber=$m[1]; return '';},$article->text,1);
echo $article->text;
echo "\n";
echo $partnumber;
输出:
Some leading text some trailing text
ABCDEF1234
通过从preg_replace()
切换到preg_replace_callback()
,您可以调用匿名函数来执行这两项任务。首先,声明新变量$partnumber
,然后空字符串替换更大的插件子字符串(全字符串匹配)。
use(&$partnumber)
允许您在回调函数中声明一个可修改的变量,该变量将在全局范围内可用。
我的方法假设只有 1 找到$partnumber
(这就是为什么第4个参数中的值有1
的原因。如果有的话或者更多,然后必须删除第4个参数,并且必须将$partnumber
赋值写为数组$partnumber[]=$m[1]
,以便之前的匹配不被后来的匹配覆盖。