我想捕获响应主题字符串中的模式的字符串。
模式示例:## name ##,## address ##,## bankAccount ##,...
主题示例:
这是带有模式的模板:## name ##
您的银行帐户是:## bankAccount ##
您的地址是:##地址##
使用以下正则表达式:.*(#{2}[a-zA-Z]*#{2}).*
,只匹配最后一个模式。
如何捕捉所有模式,而不仅仅是最后一个或第一个?
答案 0 :(得分:1)
现在我已正确格式化你的正则表达式了,问题就出现了。你的正则表达式中的*
被隐藏了,因为markdown用它来使文本变为斜体。
您的开场.*
尽可能地贪婪地匹配,只备份足以让(#{2}[a-zA-Z]*#{2})
匹配。这匹配在行中找到的最后一个模式,它之前的所有模式都与.*
匹配。
答案 1 :(得分:0)
您需要删除我在评论中提到的.*
,并使用preg_match_all
:
$re = '~#{2}[a-zA-Z]*#{2}~';
preg_match_all($re, "##name##, ##address##, ##bankAccount##", $m);
print_r($m);
请参阅PHP demo
.*#{2}[a-zA-Z]*#{2}.*
首先匹配0或更多字符而不是换行符,抓取整个行,然后回溯到最后一次出现的#{2}[a-zA-Z]*#{2}
模式,并且最后.*
只占用行的其余部分。删除.*
并使用preg_match_all
,可以提取与#{2}[a-zA-Z]*#{2}
模式匹配的所有子字符串。