Php 正则表达式
我有一个字符串:/foo/{bar}/{baz?} 现在我想提取{…}中的所有单词。 但是在带“?”的单词上,我不仅要选择{…},还要选择“{”之前的“/” 到目前为止,我得到了这个:Php 正则表达式,php,regex,Php,Regex,我有一个字符串:/foo/{bar}/{baz?} 现在我想提取{…}中的所有单词。 但是在带“?”的单词上,我不仅要选择{…},还要选择“{”之前的“/” 到目前为止,我得到了这个: $string = '/foo/{bar}/{baz?}'; preg_match_all('~{(\w+)[?]?}~', $string, $matches); print_r($matches); 结果: Array ( [0] => Array (
$string = '/foo/{bar}/{baz?}';
preg_match_all('~{(\w+)[?]?}~', $string, $matches);
print_r($matches);
结果:
Array
(
[0] => Array
(
[0] => {bar}
[1] => {baz?}
)
[1] => Array
(
[0] => bar
[1] => baz
)
)
但应该是:
Array
(
[0] => Array
(
[0] => {bar}
[1] => /{baz?}
)
[1] => Array
(
[0] => bar
[1] => baz
)
)
(注意{baz?}匹配之前的/)
希望这足够清楚我的英语不是很好。
谢谢使用一个((?|…|…)
),其中包含两个共享相同ID的捕获组:
/(?|\/{(\w+)\?}|{(\w+)})/
见
详细信息:
-分支重置组启动(?|
-a\/{(\w+?}
,然后是1+字字符(捕获到组1中),然后是/{
?}
-或|
-a{(\w+)
后跟1+字字符(再次捕获到组1),然后{
}
@JeffHuijsmans如果一个模式是正则的,正则表达式将能够匹配它。这个模式看起来是正则的,所以很好。有关路由系统im,请参阅@JeffHuijsmans itsbuilding@Halcyon谢谢你纠正我!我将删除相应的注释。PHP是一种成熟的编程语言,为什么不使用PHP的if/else而不是尝试让正则表达式做一些它不太适合做的事情?除此之外,PHP比正则表达式更具表现力,因此在将来查看代码时更容易了解它试图做什么。此正则表达式可能会有所帮助:
~(((/{[^}]*\?}){[^}]*}~
,尽管它很难阅读。有一个外行定义“或”(this | that)
。“This”是以/开头并包含{smth?}(/{[^}]*\?})
的内容的捕获组。[^}]*
部分将匹配所有内容,直到下一个右括号结束。而“that”捕获组不包含问号,因此与斜杠不匹配(或者如果您只想匹配曲括号之前的任何字符,请将斜杠切换为点)。
$re = '/(?|\/{(\w+)\?}|{(\w+)})/';
$str = '/foo/{bar}/{baz?}';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
print_r($matches);