我已尝试过多个函数来提取两个字符串之间的任何内容,分隔符可能包含特殊字符,我猜这就是为什么没有一个对我有效。
我目前的职能:
function between($str, $startTag, $endTag){
$delimiter = '#';
$regex = $delimiter . preg_quote($startTag, $delimiter)
. '(.*?)'
. preg_quote($endTag, $delimiter)
. $delimiter
. 's';
preg_match($regex, $str, $matches);
return $matches;
}
字符串示例:
#{ST@RT}#
Text i want
#{END}#
#{ST@RT}#
Second text i want
#{END}#
如何改进或建议另一种解决方案:
当前行为:仅返回第一个匹配项,并返回匹配项以及不需要的周围标记
答案 0 :(得分:6)
对多行正则表达式使用m
选项(它允许.
字符匹配换行符):
preg_match('/foo.+bar/m', $str);
// ^--- this
使用preg_match_all()获取多个字符串:
preg_match_all($regex, $str, $matches);
return $matches[1]; // an array of the strings
修改强>
您当前代码返回匹配项以及周围标记的原因是因为您使用的是return $matches
。 $matches
数组中包含多个元素。索引0
始终是与表达式匹配的整个字符串。索引1
和更高版本是您的捕获组。在您的表达式中,您只有一个捕获组(“字符串”),因此您只希望return $matches[1]
而不是return $matches
。
答案 1 :(得分:0)
你可以使用preg_match_all提取多个字符串,除了你的代码看起来很简单,通常更简单更快。