运行正则表达式 - 需要找到字符串模式出现的确切位置

时间:2010-08-23 12:38:06

标签: php regex

这是previous question的后续跟进。

正则表达式工作得很好但是我需要能够找出模式出现的确切位置。例如,如果我的正则表达式是从以下字符串中提取子字符串'bob'的实例:

This is abobsled

我想知道字符串中第一次出现模式的确切字符位置,即在这种情况下它在第10个字符位置 - 这可能吗?我在这里使用php。

==========================

谢谢,我想我再次陷入困境 - 但目前这是我想做的事情。可以说我有这种性质的模板:

Hello <=name=>

Take Care

From <=sender=>

现在很简单,因为所有细节都是一个单词,但是如果替换标签的数据扩展到多行,我想设置它,所以它保持一些格式化,就像我使用它时使用的正则表达式一样用多行的东西替换标签我得到以下内容:

Numbers: <=numbers=>

变为

Numbers: number1
number2

当我想要这样的东西时:

Numbers: Number1
         Number2

我该怎么做:(

2 个答案:

答案 0 :(得分:6)

请参阅:http://docs.php.net/preg_match_all和/或http://docs.php.net/preg_match

中的PREG_OFFSET_CAPTURE标记

E.g。

<?php
$subject = 'This is abobsled';
preg_match('/b.b/', $subject, $m, PREG_OFFSET_CAPTURE);
var_dump($m)

打印

array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(3) "bob"
    [1]=>
    int(9)
  }
}
它从0开始计数,因此第10个字符位于第9位。

答案 1 :(得分:2)

您可以使用相同的正则表达式并考虑到位置。

例如:

function replace_content($tag,$position, $multiline)
{
    $out='Number 1';
    $padding=implode('',array_fill(0,$position, ' '));

    if ($multiline)
    {
        $out.="\n".$padding.'Number 2';
        // etc..
    }
    return $out
}