1

我有一个正则表达式,它查看 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>

我似乎无法弄清楚我的正则表达式有什么问题,它不会拾取单引号。有任何想法吗?

4

1 回答 1

2

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

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

带有惰性量词的简单方法:

(["']).*?\1

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

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

2)使用交替:

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

带有捕获组的有趣变体:

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

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

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

于 2013-06-16T17:40:35.340 回答