以下面的例子为例,
preg_match_all("/(^|-)[a-z]+(-|$)/i", "foo-bar-moo", $matches);
这(正确)返回以下匹配项,
foo-
-moo
但是,我需要生成以下匹配输出,
foo-
-bar-
-moo
真的有办法吗?例如,在匹配后将搜索指针移回一个字符?
我唯一的另一个想法是将它放入
while()
循环,删除每个循环上的匹配项,直到找到所有匹配项。谢谢。
编辑:我试图简化我的问题,使问题更清楚,但这样做,我似乎歪曲了我的问题实际上是什么。道歉。
基本上,我需要一种方法来匹配字符串中的一个单词,其中前一个字符或后一个字符是某个字符,但同时又不捕获匹配中的这些前导和尾随字符。
我觉得你不能这么做,所以我决定捕获前导/尾随字符并亲自删除它们。这让我想到了上面的问题。
正如tim pietzcker指出的,我真正需要的是lookarounds。
对于上面的例子,解决方法如下,
preg_match_all('/(?<=^|-)[a-z]+(?=-|$)/', "foo-bar-moo", $result);
它输出,
foo
bar
moo
再次感谢你的回答和帮助。
最佳答案
使用lookaround并将捕获组放在lookaround表达式中。这允许您在一个preg_match_all()
调用中完成此操作,并且仍然捕获-
es(如果存在):
preg_match_all('/(?<=(^|-))([a-z]+)(?=(-|$))/', $subject, $result, PREG_SET_ORDER);
for ($match = 0; $match < count($result); $match++) {
echo $result[$match][1] . $result[$match][2] . $result[$match][3];
}