Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从文本中删除子字符串并将嵌套子字符串指定给变量?_Php_String_Preg Replace - Fatal编程技术网

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

Php 如何从文本中删除子字符串并将嵌套子字符串指定给变量?,php,string,preg-replace,Php,String,Preg Replace,我正在Joomla开发一个模块,在这个模块中,我需要从$article->text中删除这个片段,并提取零件号,将其内容存储在$part\u number中 {myplugin}ABCDEF1234,"Flux Capacitor"{/myplugin} 我一直在想办法,但没办法: $re = '/\{myplugin\}(\w+),[^{}]+\{\/myplugin\}/'; $subst = ''; $result = preg_replace($re, $subst, $artic

我正在Joomla开发一个模块,在这个模块中,我需要从
$article->text
中删除这个片段,并提取零件号,将其内容存储在
$part\u number

{myplugin}ABCDEF1234,"Flux Capacitor"{/myplugin}
我一直在想办法,但没办法:

$re = '/\{myplugin\}(\w+),[^{}]+\{\/myplugin\}/';

$subst = '';

$result = preg_replace($re, $subst, $article->text);
$article->text = $result;
但这不会返回零件号,因此我可以将其放入
$part\u number
中。这可以在一个正则表达式操作中完成,还是应该在一个正则表达式操作中提取数字,然后在第二个正则表达式操作中从
$article->text
中删除代码段


其目的是将
{myplugin}ABCDEF1234,“磁通电容器”{/myplugin}
$article->text
中删除,并将其部件号(如
ABCDEF1234
从该代码段复制并存储在PHP变量
$part\u number

中,我建议您使用
preg\u match

{myplugin}ABCDEF1234,"Flux Capacitor"{/myplugin}
$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)
UPD:


是的,您可以从
$article->text
中删除插件子字符串,并一次性声明
$partnumber

代码:()

输出:

Some leading text  some trailing text
ABCDEF1234
通过从
preg\u replace()
切换到
preg\u replace\u callback()
可以调用匿名函数来执行这两项任务。首先,声明新变量
$partnumber
,然后空字符串替换较大的插件子字符串(fullstring匹配)

use(&$partnumber)
允许您在回调函数内声明一个可修改的变量,该变量将在全局范围内可用


我的方法假设只会找到1
$partnumber
(这就是为什么第四个参数中的值有
1
。如果有两个或更多个参数,则必须删除第四个参数,
$partnumber
分配必须作为数组写入
$partnumber[]=$m[1]
以便早期匹配不会被后期匹配覆盖。

请在问题中写出您的预期结果。@mickmackusa完成。您需要
字符串中的字母数字,对吗?@MUT Yes,字母数字。尝试
\b[a-zA-Z]+[0-9]+\b
,希望你的代码能起作用。@EdwardCoast我是否误解了任务?你理解得很好。你有$subst,但没有使用它。你的代码的哪一部分正在删除代码片段?你看到插件在输出中消失了吗?这就是你要求的吗?如果你提供一个更完整、更详细的说明,我会更清楚
$article text
@mickmacusa的alistic字符串是的,我看到了。我在问你的PHP代码的哪一部分能够做到这一点。你的$article->text的演示数据很好。@EdwardCoast我的解释对你来说足够了吗?或者你还有更多的需要我解释的吗?你会为这一页授予绿色勾号吗?@mick mack美国使用
$result
数组,他可以通过
str_replace
(使用
$result[0]
)删除此字符串形式的文本,并从
$result[1]获取零件号
@mickmackusa请说明哪里提到了
一次调用
?仅供参考,如果同一行中存在两个插件标记,您的答案将不匹配。但这可能超出了问题的范围。OP确实会问:这是否可以通过一个正则表达式操作完成,我将其解释为一个步骤,而您的方法使用一个regex调用,然后是单独的非正则表达式替换调用。
Some leading text  some trailing text
ABCDEF1234