我有一个正则表达式:
'/ abc \( (complexRegex)(,complexRegex)*? \) /Uux'
匹配类似: abc(complexStructure,complexStructure,complexStructure)
如何不写两次 complexRegex?
在基本的 PHP 中,没有办法(除了使用 eisberg 建议的变量技巧,但它仍然在正则表达式本身中重复)。在 PHP5 中,我听说他们放入了 Oniguruma(Ruby 1.9 的扩展正则表达式引擎),但我自己没有尝试过,除了 Oniguruma 的 Wikipedia 页面说的内容外,找不到像样的参考资料。如果是真的,你可以有这个:
/abc:(?<complexRegex>d.f)(,\g<complexRegex>)*:ghi/
例如,它将通过为模式 ( ) 指定名称来匹配"abc:def,daf,dif:ghi"
,而不重复模式 ( )。d.f
complexRegex
您在 PHP 中可以避免通过变量编写 complexRegex!
$complexRegex = 'your complexRegex here';
$regex = '/ abc \( (' . $complexRegex . ')(,' . $complexRegex . ')*? \) /Uux';
另请阅读 PCRE 中的反向引用:http ://www.php.net/manual/en/regexp.reference.back-references.php
You can match 0 or 1 comma with ?
'/ abc \((,?(complexRegex))* \)/
I added white space to make it clearer but you should match any number of white spaces wherever required.
您还可以使用反向引用,例如
(x[ms]l).com/\1
# the \1 is the backreference which matches the first capture group
将匹配
xml.com/xml
and
xsl.com/xsl