2012-03-31 39 views
1

我试过了多个函数来提取两个字符串之间的任何内容,分隔符可能包含特殊字符,我想这就是为什么没有为我工作。在两个分隔符之间提取字符串的最可靠方法

我目前的功能:

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

字符串的例子:

#{[email protected]}# 
Text i want 
#{END}# 

#{[email protected]}# 
Second text i want 
#{END}# 

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

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

当前的行为:只返回了第一场比赛,而且还返回匹配加上周围的标签是不希望

回答

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 

编辑:

您当前的代码返回匹配的原因加上t他周围的标签是因为你使用return $matches$matches数组中有几个元素。索引0始终是与表达式匹配的整个字符串。索引1及更高版本是您的捕获组。在你的表达中,你只有一个捕获组(“字符串”),所以你只想做return $matches[1]而不是return $matches

0

您可以使用preg_match_all提取多个字符串,除了你代码看起来很简单,通常简单快一些。

相关问题