我想从右到左进行匹配,下面是这样的例子之一。
100abababab3x3x3xx1000morewords
如果我想匹配最后一个xx
与前一个ab
之间的某个内容并得到3x3x3
我尝试了以下操作,但它与ababab3x3x3
匹配
preg_match('/ab(.*?)xx/',$text,$totmat);
注意:请不要推荐strrev。
上面的例子只是为了说明,我要做的就是从右到左匹配。
答案 0 :(得分:1)
不确定这是否是最优化的方法吗?但是,如果您结合使用前瞻性肯定 (?=)
和后继肯定性 (?<=)
,这将对您有用。参见regex
<?php
$re = '/\w+(?<=ab)(.*?)(?=xx)/m';
$str = '100abababab3x3x3xx1000morewords';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the full matched result
echo $matches[0][1];
答案 1 :(得分:0)
$str = '100abababab3x3x3xx1000morewords';
preg_match('/ab((?:(?!ab).)*)xx/', $str, $m);
print_r($m);
输出:
Array
(
[0] => ab3x3x3xx
[1] => 3x3x3
)
>说明:
ab : literally ab
( : start group 1
(?: : start non capture group
(?!ab) : negative lookahead, make sure we doon't have ab
. : any character but newline
)* : end group, may appear 0 or more times
) : end group 1
xx : literally xx
答案 2 :(得分:0)
除了正则表达式外,还有其他方法可以将计算时间快两倍。
例如:
$str = "100abababab3x3x3xx1000morewords";
$result = explode("ab", explode("xx", $str)[0]);
var_dump(end($result));
第一次发生爆炸时,会将字符串分成两个“ xx”字符。我们只对左边部分(索引0)感兴趣。
第二次爆炸发生时,爆竹用ab分割线。我们只对ab的最后一次出现感兴趣。因此var_dump(end($result));
打印出预期的结果。