You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用preg_match提取&间含指定字符串的内容?

解决你的preg_match提取需求问题

我明白你现在的困扰——要从一堆文本里提取夹在&之间且包含特定文本的内容,但之前的正则总是跨多个分隔符,拿不到正确结果。

先说说你原来的正则&([^\n]*thistext[^\n]*)&的问题:[^\n]*是贪婪匹配,它会把除了换行以外的所有内容都算进去,包括中间的&分隔符,所以会从第一个&一直匹配到最后一个带thistext的&,把中间无关的内容也裹进来,自然不对。

正确的解决方案

要解决这个问题,核心是确保匹配的内容不会跨&分隔符,同时要提取所有符合条件的项,所以得用preg_match_all而不是preg_match(后者只抓第一个匹配结果)。

给你两个可行的方案:

方案1:非贪婪匹配(简单易用)

用非贪婪的.*?来匹配分隔符之间的内容,确保不会跨到下一个&:

$text = "thisip4:isatextexample&ineed.thistext&TXT:&andthis.idontneed&txt:&test.thistext&";
$pattern = '/&(.*?thistext.*?)&/';
preg_match_all($pattern, $text, $matches);
$results = $matches[1];
print_r($results);

方案2:负前瞻断言(更严谨)

如果担心内容里有单独的&字符(不是&),可以用负前瞻来确保匹配过程中不会碰到&:

$text = "thisip4:isatextexample&ineed.thistext&TXT:&andthis.idontneed&txt:&test.thistext&";
$pattern = '/&((?:(?!&).)*thistext(?:(?!&).)*)&/';
preg_match_all($pattern, $text, $matches);
$results = $matches[1];
print_r($results);

结果验证

不管用哪个方案,运行后都会得到你想要的结果:

Array
(
    [0] => ineed.thistext
    [1] => test.thistext
)

简单总结下:用preg_match_all抓所有匹配项,正则里限制内容不跨&分隔符,就能准确提取到你需要的文本啦。

内容的提问来源于stack exchange,提问作者user1973842

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:31:19