Php preg_匹配所有第一个匹配项,并在一个文件中获得两个匹配项
示例字符串: 这是一个带有一些测试用例的示例字符串\cite{author1,author2}。然后{另一个示例}\citeauthor{author3},最后\citeP{author1}和string在此完成 要求:1。我需要全局提取{}之间但“\cite”字符串之后的内容。(例如.\cite{..}或\citeauthor{..})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的提取字符串,字符串将被
我试过:
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[^}}}}}}/'