我有一个正则表达式,它查看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>
我似乎无法弄清楚我的正则表达式有什么不对,它不会拿起单引号。有什么想法吗?
答案 0 :(得分:2)
我给你一个通用答案,然后你可以根据你的情况调整它。要匹配单引号或双引号,技巧是:
1)使用反向引用(\1
引用捕获组1):
使用延迟量词的简单方法:
(["']).*?\1
优化且更安全的方法(处理转义引号):
(["'])(?>[^"']|["'](?<!\1)|(?<=\\)\1)*+\1
2)使用替换:
(?>"....."|'.....')
捕获组的有趣变体:
(?|"...(###)..."|'...(###)...')
并且两个捕获组具有相同的编号。
注意:问题不是来自你的模式。