使用PHP获取以某个字符串开头并以另一个字符串结尾的所有匹配项

15

我该如何使用PHP从这个字符串中提取[startstring][endstring]之间的所有内容:

[startstring]hello = guys[endstring] hello guys [startstring]jerk = you[endstring] welcome to the universe

我想找到所有与[startstring][endstring]相匹配的内容,并输出它们之间的文本,就像分隔符一样。我希望所有匹配结果用空格分隔。

我该如何实现呢?需要使用regex吗?能否提供一个示例?

非常感谢! :)

2个回答

19
preg_match_all('/\[startstring\](.*?)\[endstring\]/s', $input, $matches);
echo implode(' ', $matches);

preg_match_all('/\[startstring\](.*?)\=(.*?)\[endstring\]/s', $input, $matches);
for ($i = 0; $i < count($matches[1]); $i++) {
    $key = $matches[1][$i];
    $value = $matches[2][$i];
    $$key = $value;
}

$hello$jerk中,就像你说的那样。只需运行它,回显变量并尝试一下! - Jeroen

4

请尝试使用preg_match_all

preg_match_all('/\[startstring\](.*?)\[endstring\]/', $input, $matches);
var_dump($matches);

"(.*?)" 意味着会有很多回溯,但这是目前最简单的方法,而且应该没问题。希望字符串不是太大 ;-) - Gras Double
@DoubleGras 这将是一个巨大的问题... :( 你有什么建议? - user1935281
我该如何将每个匹配项转换为变量?比如将hello = guys变成一个真正可用的变量在我的脚本中? $hello = guys - user1935281
我不认为这很“巨大”,只是我想表达的不是那么夸张。别担心,优化这段代码可能真的是你最不用担心的事情。至于像你建议的动态创建变量,忘了吧:不安全,容易崩溃等等。 - Gras Double
@DoubleGras 不,我的意思是很大。就像我正在处理整个文档。它仍然会很快吗?还是怎么样?感谢您的帮助。 - user1935281
你只需要在[startstring]和[endstring]之间进行一些回溯,所以这是完全可以接受的(我会说几乎完美)。唯一的问题是如果你的文档格式错误(缺少[endstring]),那就有点麻烦了。当我说“巨大”时,是指在[startstring]和[endstring]之间有数十兆字节的内容。 - Gras Double

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接