PHP preg_match - 捕获使用双引号或单引号的属性

时间:2013-06-16 17:09:42

标签: php preg-match quotes

我有一个正则表达式,它查看HTML文件,如果它们与我传入的正则表达式匹配,则查找基于它的元素。确定元素是否匹配的一个主要因素是id是什么。 id必须是我决定使用的一些特殊字符。问题是,我知道在HTML中编写ID时,有些人会使用双引号或单引号。我希望能够抓住这两种情况。所以我的正则表达式是:

preg_match('@(<)([^\s]*).*(id)\s*=\s*["|\']{{ALViewElement_'.$viewElement.'}}["|\'][^/]*?(>)@i', $viewFile, $elementMatches, PREG_OFFSET_CAPTURE)

靠近中间,你会看到我id的位置。在等号之后我有["|\']然后在最后我对结束报价有同样的看法。

如果我的html看起来像这样,我得到一个匹配:

<section  id="{{ALViewElement_resume}}" data-test="testing" >
            <!--{{RESUME_ADD_CHANGE_PIECE}}-->
            <!--{{RESUME}}-->
        </section>

但是,如果我使用单引号,则不匹配:

<section  id='{{ALViewElement_resume}}' data-test="testing" >
            <!--{{RESUME_ADD_CHANGE_PIECE}}-->
            <!--{{RESUME}}-->
        </section>

我似乎无法弄清楚我的正则表达式有什么不对,它不会拿起单引号。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我给你一个通用答案,然后你可以根据你的情况调整它。要匹配单引号或双引号,技巧是:

1)使用反向引用(\1引用捕获组1):

使用延迟量词的简单方法:

(["']).*?\1

优化且更安全的方法(处理转义引号):

(["'])(?>[^"']|["'](?<!\1)|(?<=\\)\1)*+\1

2)使用替换:

(?>"....."|'.....')

捕获组的有趣变体:

(?|"...(###)..."|'...(###)...')

并且两个捕获组具有相同的编号。

注意:问题不是来自你的模式。