使用preg_match()查找匹配模式的子字符串的开始/停止位置

时间:2010-06-16 08:15:59

标签: php preg-match strpos

我想使用PHP复制字符串的子字符串。

第一个模式的正则表达式为/\d\|\d\w0:/

第二种模式的正则表达式为/\d\w\w\d+:\s-\s:/

是否可以将preg_matchstrpos结合起来,从头到尾获取确切的位置,然后将其复制为:

substr( $string, $firstPos,$secPos ) ?

4 个答案:

答案 0 :(得分:4)

我不确定,但也许您可以像这样使用preg_split

$mysubtext = preg_split("/\d\|\d\w0:/", $mytext);

$mysubtext = preg_split("/\d\w\w\d+:\s-\s:/", $mysubtext[1]);

$mysubtext = $mysubtext[0];

答案 1 :(得分:3)

不确定。

或者,您可以将模式组合成一个新的超级神奇的模式,它匹配它们之间的内容(通过声明前缀出现在匹配的子字符串之前,后缀紧接在它之后)。

$prefix = '\d|\d\w0:';
$suffix = '\d\w\w\d+:\s-\s:';
if (preg_match("/(?<=$prefix).*?(?=$suffix)/", $subject, $match)) {
    $substring = $match[0];
}

(旁白:如果您的子字符串跨越多行,您可能希望使用s修饰符或.以外的其他修饰符。)

答案 2 :(得分:3)

使用preg_match()的第四个参数时,您甚至可以设置PREG_OFFSET_CAPTURE标志,让函数返回匹配字符串的偏移量。因此,不需要合并preg_match()strpos()

http://php.net/manual/function.preg-match.php

答案 3 :(得分:0)

preg_match的第三个参数是一个输出参数,它收集你的捕获,即匹配的实际字符串。用这些来喂你的strpos。 Strpos不接受正则表达式,但捕获将包含实际匹配的文本,该文本包含在字符串中。要进行捕获,请使用括号。

例如(尚未尝试过,但这是为了得到这个想法):

$str = 'aaabbbaaa';
preg_match('/(b+)/', $str, $regs );
// now, $regs[0] holds the entire string, while $regs[1] holds the first group, i.e. 'bbb'
// now feed $regs[1] to strpos, to find its position