如何用preg_match提取&间含指定字符串的内容?
解决你的preg_match提取需求问题
我明白你现在的困扰——要从一堆文本里提取夹在&之间且包含特定文本的内容,但之前的正则总是跨多个分隔符,拿不到正确结果。
先说说你原来的正则&([^\n]*thistext[^\n]*)&的问题:[^\n]*是贪婪匹配,它会把除了换行以外的所有内容都算进去,包括中间的&分隔符,所以会从第一个&一直匹配到最后一个带thistext的&,把中间无关的内容也裹进来,自然不对。
正确的解决方案
要解决这个问题,核心是确保匹配的内容不会跨&分隔符,同时要提取所有符合条件的项,所以得用preg_match_all而不是preg_match(后者只抓第一个匹配结果)。
给你两个可行的方案:
方案1:非贪婪匹配(简单易用)
用非贪婪的.*?来匹配分隔符之间的内容,确保不会跨到下一个&:
$text = "thisip4:isatextexample&ineed.thistext&TXT:&andthis.idontneed&txt:&test.thistext&"; $pattern = '/&(.*?thistext.*?)&/'; preg_match_all($pattern, $text, $matches); $results = $matches[1]; print_r($results);
方案2:负前瞻断言(更严谨)
如果担心内容里有单独的&字符(不是&),可以用负前瞻来确保匹配过程中不会碰到&:
$text = "thisip4:isatextexample&ineed.thistext&TXT:&andthis.idontneed&txt:&test.thistext&"; $pattern = '/&((?:(?!&).)*thistext(?:(?!&).)*)&/'; preg_match_all($pattern, $text, $matches); $results = $matches[1]; print_r($results);
结果验证
不管用哪个方案,运行后都会得到你想要的结果:
Array ( [0] => ineed.thistext [1] => test.thistext )
简单总结下:用preg_match_all抓所有匹配项,正则里限制内容不跨&分隔符,就能准确提取到你需要的文本啦。
内容的提问来源于stack exchange,提问作者user1973842
相关产品推荐
相关产品推荐

