如何匹配(PCRE)两个标签之间的所有内容?

我试过这样的事情:

  

LT <!>;! - <!> - \ S * LoginStart \ S * GT; LT(*)。<!>;! - \ S * LoginEnd \ S * - GT <!> ;

但它对我来说效果不佳..

我对正则表达式有点新意,所以我希望有人能够向我解释如果能用正则表达式实现这一点,我将如何实现这一目标。

由于

有帮助吗?

解决方案

$string = '<!-- LoginStart --><div id="stuff">text</div><!-- LoginEnds -->';
$regex = '#<!--\s*LoginStart\s*-->(.*?)<!--\s*LoginEnds\s*-->#s';

preg_match($regex, $string, $matches);

print_r($matches); // $matches[1] = <div id="stuff">text</div>

说明:

(.*?) = non greedy match (match the first <!-- LoginEnds --> it finds
    s = modifier in $regex (end of the variable) allows multiline matches
        such as '<!-- LoginStart -->stuff
                 more stuff
                 <!-- LoginEnds -->'

其他提示

PHP和正则表达式?以下是一些建议:

'/<!--\s*LoginStart\s*-->(.*)<!--\s*LoginEnd\s*-->/Us'

可能会更好 - U大写不会使正则表达式变得非贪婪,这意味着它将停留在可能有效的第一个<!--。但重要的是s,它告诉正则表达式将换行符与.字符匹配。

根据您对大小写的确定程度,最后添加i会使正则表达式搜索不区分大小写。

我已经尝试过欧文的答案,但是它没有达到像

这样的条件

<!-- LoginStart --><div id="stuff">text</div><!-- LoginEnds -->"DONT MIND THIS"<!-- LoginStart --><div id="stuff">text</div><!-- LoginEnds -->

这包括行<!>“DONT MIND THIS <!>”;也就是说,它首先涵盖了所有内容 <!> lt;! - LoginStart - <!> gt;最后<!> lt;! - LoginEnds - <!> gt;标签

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top