Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_匹配所有第一个匹配项,并在一个文件中获得两个匹配项_Php_Regex - Fatal编程技术网

Php preg_匹配所有第一个匹配项,并在一个文件中获得两个匹配项

Php preg_匹配所有第一个匹配项,并在一个文件中获得两个匹配项,php,regex,Php,Regex,示例字符串: 这是一个带有一些测试用例的示例字符串\cite{author1,author2}。然后{另一个示例}\citeauthor{author3},最后\citeP{author1}和string在此完成 要求:1。我需要全局提取{}之间但“\cite”字符串之后的内容。(例如.\cite{..}或\citeauthor{..}) 我试过:preg_match('/[^\\\\cite]{(.*?}/',$text,$match)//力功 2.使用基于demill的提取字符串,字符串将被

示例字符串:

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

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

我试过:
preg_match('/[^\\\\cite]{(.*?}/',$text,$match)//力功

2.使用基于demill的提取字符串,字符串将被分解。
(例如,如果提取的字符串=“author1,author2”)
,则它将基于“,”字符进行分解。
//将使用explode()进行分解。

3.如果花括号来自
(\cite或\citeauthor等)
,则应将其替换为
,例如,分解字符串
,因为我想知道字符串是来自
“cite”还是“citeauthor”或“citeP”。

4.如果分解的字符串是第一次出现,我想替换字符串<代码>用于例如分解字符串

预期输出: 这是一个带有一些测试用例的示例字符串
author1author2.
然后{另一个示例}
author3
最后是
author2
,字符串在这里完成

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

output=
分解字符串
-如果我在
\cite
之后只得到{}之间的字符串,那么如何在每次出现时也得到
“\cite”
字符串


谢谢你的阅读。对不起,这篇文章太大了,我想这是可以理解的。你可以使用
preg\u replace\u 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);
$s='这是一个带有一些测试用例的示例字符串\cite{author1,author2}。
然后{另一个例子}\citeauthor{author3}最后
\citeP{author1}和字符串在此完成。“;
echo preg\u replace\u回调('/\\\\(引用(?:P|author)?){([^}]*)}/',函数($m){
返回preg_replace('/([^,]+)(?:,|$)/','$1',$m[2]),
$s);
输出

这是一个带有一些测试用例author1author2的示例字符串。
然后{另一个例子}author3,最后
author1和字符串在此完成。


问一个问题,别忘了展示你的尝试。你尝试过什么吗?你尝试过的没有多大意义,请看:(regexper是一个通过示例学习正则表达式的有用工具!)我认为这是一个关于我需要获得的每一个事件的单一问题,{}之间的内容,然后是花括号的来源(“\cite”或\citeauthor)和字符串的第一次出现。因此,我需要基于这些要求的正则表达式
\citeP{author1}
这是一个错误吗?您已经告诉了“\cite{..}或\citeauthor{..}”,但是没有告诉您关于这个
P
…谢谢它的完美。但是1不是固定的
(author2)
。如果该字符串只是第一次出现,那么应该在那里插入1。在这个
author1
author1第二次出现的时候,输出应该是
author1
你可以用这段代码,在
callback
函数中为它建立一些额外的逻辑。实际上,我是一个学习正则表达式的人,对于我的要求,我认为正则表达式应该是两行步骤和最快的方式。因为我对正则表达式不太了解,如何将第一次出现的逻辑添加到模式中?同时,在这个正则表达式中声明了
/\\\\(引用(?:P | author){([^}]*)}/
P或author
。如何在
(?:P | author)
的位置为任何文本设置模式。例如
\cite一些文本{testing}
输出应该是:
testing
我试过:
/\\\\\\(cite(?:P | author | a-z){([^}]*}/
但不管用。是的,对不起,应该是:
'/\\\\\\\\\\\\\\\\\\\\(cite[^}}}}}}/'