在两个分隔符之间提取字符串的最可靠方法

时间:2012-03-31 02:22:52

标签: php regex

我已尝试过多个函数来提取两个字符串之间的任何内容,分隔符可能包含特殊字符,我猜这就是为什么没有一个对我有效。

我目前的职能:

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}#

如何改进或建议另一种解决方案:

  • 支持任何类型的字符或新行
  • 如果找到则提取多个字符串

当前行为:仅返回第一个匹配项,并返回匹配项以及不需要的周围标记

2 个答案:

答案 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提取多个字符串,除了你的代码看起来很简单,通常更简单更快。