如何从文本中删除子字符串并将嵌套子字符串分配给变量?
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]
以便前面的匹配不会被后面的匹配覆盖。
我正在 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]
以便前面的匹配不会被后面的匹配覆盖。