preg_match所有第一次出现并在文件中获得两个匹配

时间:2015-02-03 07:33:20

标签: php regex

示例字符串:

这是一个包含一些测试用例\ cite {author1,author2}的示例字符串。然后{另一个例子} \ citeauthor {author3},最后是\ citeP {author1}和字符串在这里完成。

要求: 1.我需要在{}之间提取内容,但在全局之后提取“\ cite”字符串。 (例如。\ cite {..}或\ citeauthor {..})

我尝试过: preg_match('/[^\\\\cite]{(.*?)}/', $text, $match);//dint work

2.使用基于demiliter的提取字符串,字符串将被展开。(eg. if extracted string="author1,author2"),然后它将根据“,”charac)展开。//it will be done with explode()

3.如果大括号来自(\cite or \citeauthor etc),则应将其替换为for eg. <xref cite>exploded string</xref>,因为我想知道该字符串是否来自"cite" or "citeauthor" or "citeP".

4.如果爆炸的字符串是第一次出现,我想要替换字符串。 For eg. <xref cite 1>exploded string</xref>

预期输出 这是一个带有一些测试用例的示例字符串<xref cite 1>author1</xref><xref cite 1>author2</xref>.然后{另一个示例} <xref citeauthor 1>author3</xref>,最后是<xref citeP>author2</xref>,字符串在这里完成。

那么,如何获得(\cite or \citep or \citeauthor)之间的字符串{} 以及文件中第一次出现的字符串。

output = <xref cite 1>exploded string</xref> - 如果我在\cite之后只在{}之间得到字符串,那么如何在每次出现时都获得"\cite"字符串。

谢谢阅读。对不起这篇重要帖子,我认为这是可以理解的

1 个答案:

答案 0 :(得分:1)

您可以使用preg_replace_callback

$s = 'This is a example string with some testing cases \cite{author1,author2}. 
Then {another example} \citeauthor{author3} and finally
\citeP{author1} and string completes here.';

echo preg_replace_callback('/\\\\(cite(?:P|author)?){([^}]*)}/', function($m) {
  return preg_replace('/([^,]+)(?:,|$)/' ,'<xref '. $m[1] . ' 1>$1</xref>', $m[2]); },
  $s);

<强>输出

  

This is a example string with some testing cases <xref cite 1>author1</xref><xref cite 1>author2</xref>. Then {another example} <xref citeauthor 1>author3</xref> and finally <xref citeP 1>author1</xref> and string completes here.