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

How to remove a substring from text and assign a nested substring to a variable?

我正在 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;

但这不是 return 部件号,所以我可以将它放在 $part_number 中。这可以在一个正则表达式操作中完成,还是应该先提取数字,然后再从 $article->text?

中删除片段

目的是从 $article->text 中删除 {myplugin}ABCDEF1234,"Flux Capacitor"{/myplugin} 并从该代码段中复制其部件号 ABCDEF1234 并存储在 PHP 变量中 $part_number.

我建议您使用 preg_match:

$s='{myplugin}ABCDEF1234,"Flux Capacitor"{/myplugin}';
preg_match('/{myplugin}(\w+)\,"(.+)"{\/myplugin}/', $s, $result);

$result 将是:

array (size=3)
  0 => string '{myplugin}ABCDEF1234,"Flux Capacitor"{/myplugin}' (length=48)
  1 => string 'ABCDEF1234' (length=10)
  2 => string 'Flux Capacitor' (length=14)

更新:

$article->text = str_replace($result[0], '', $article->text);
$part_number = $result[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] 以便前面的匹配不会被后面的匹配覆盖。