如何从文本中删除子字符串并将嵌套子字符串分配给变量?

时间:2017-11-29 07:27:31

标签: php string preg-replace

我正在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中。

1 个答案:

答案 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],以便之前的匹配不被后来的匹配覆盖。