1

我正在尝试使用 PHP 从字符串中提取特定单词的所有索引preg_match。以这个词为例hello

$r = "/\b(hello)\b/u";

假设我想在这个字符串中查找它:

$s = 'hello. how are you, hello there. helloorona!';

如果我preg_match使用PREG_OFFSET_CAPTURE参数运行并传入一个名为 $matches 的数组,

preg_match($r, $s, $matches, PREG_OFFSET_CAPTURE);

我希望返回这样的东西(即忽略最后一个“hellooroona”短语):

["hello", 0], ["hello", 20]

但实际上,当我$matches通过json_encode或循环遍历所有匹配项返回 echo 的值时,返回的值始终是:

["hello", 0], ["hello", 0]

如果我在类似的字符串上运行它,让我们说

$s = 'how are you, hello there.';

答案是

["hello", 13]

哪个是对的。运行它hello hello hello,我得到三个索引,全为 0。

概括

所以看起来索引计数器总是简单地返回第一个索引。这是预期的行为吗?如何获取实际索引?

4

2 回答 2

2

preg_match匹配第一个匹配,然后停止。结果数组始终在其索引中包含整个匹配的表达式,并在从 开始的以下索引中包含0所有捕获组1。例如:

preg_match('/foo (\w+)/', 'foo bar', $r)

$r这里包含0 => 'foo bar', 1 => 'bar'.

hello因此,在您的情况下,由于这个原因,您只会看到前两次。

如果要匹配所有出现的表达式,请使用preg_match_all.

于 2013-08-26T07:07:02.033 回答
1

第二个["hello", 0]不是字符串中的第二个 hello,而是子组的匹配项。

使用preg_match_allwhich 会给你预期的结果:

// note: sub group is not necessary
$r = "/\bhello\b/u";
$s = 'hello. how are you, hello there. helloorona!';
preg_match_all($r, $s, $matches, PREG_OFFSET_CAPTURE);
于 2013-08-26T07:07:46.843 回答