PHP preg_match_all()未捕获子组

PHP preg_match_all()未捕获子组,php,regex,preg-match-all,Php,Regex,Preg Match All,我试图用PHP解析Twitter atom提要,但遇到了这个奇怪的问题。我用这个regexp字符串打电话: "|<entry>.*<title>(.*)</title>.*<published>(.*)</published>.*</entry>|xsU" “|.*(.*)。*(.*)。*|xsU” 它匹配所有条目,但结果中不显示捕获的子组标题/发布(在结果对象中未创建捕获的子组的数组) 现在转到奇怪的部分,我也尝试捕捉

我试图用PHP解析Twitter atom提要,但遇到了这个奇怪的问题。我用这个regexp字符串打电话:

"|<entry>.*<title>(.*)</title>.*<published>(.*)</published>.*</entry>|xsU"
“|.*(.*)。*(.*)。*|xsU”
它匹配所有条目,但结果中不显示捕获的子组标题/发布(在结果对象中未创建捕获的子组的数组)

现在转到奇怪的部分,我也尝试捕捉最后一点:

"|<entry>.*<title>(.*)</title>.*<published>(.*)</published>(.*)</entry>|xsU"
“|.*(.*)。*(.*)(.*)|xsU”
现在,捕捉工作开始了。我得到了我不想要的标题、发布日期和大量最终数据

我试图将非捕获字符串“?:”添加到最后一个子组,但捕获再次停止一起工作

那么,如何捕获我想要的数据,而不必在最后捕获大量不需要的数据呢?

我建议您使用(或)解析RSS/Atom提要。您将获得比使用正则表达式更好的结果

下面是一个示例(使用SimpleXML):

我建议您使用(或)解析RSS/Atom提要。您将获得比使用正则表达式更好的结果

下面是一个示例(使用SimpleXML):


..
(.*)
不匹配所有内容(也不匹配
)。已设置,因此它在取消冻结模式下匹配。。。否则,DOM/SimpleXML解析+1…@ircmaxell:你说得对。我错过了
U
修饰符位。谢谢。如果可以的话,我肯定会使用SimpleXml,但我想保持香草味并与PHP4兼容(是的,我知道有点愚蠢^^)。当时我找到的唯一替代方法是xml_解析器,我尝试了它,但最终得到了大量笨拙的代码。一个简单的regexp对我来说更具吸引力,对PHP/module requirements.PHP4的影响更小。
xml\u解析器
方法可能会创建更多的代码,但至少它尊重xml解析器标准。如果您想将XML规范与正则表达式相匹配,您需要做大量的工作,因为这是不可能的。。。此外,我认为再也没有理由考虑PHP4了:它不再受支持了。@tchrist:Regex不是解析器中的关键组件。我使用过的许多解析器(例如libxml)都使用顺序读取来构建解析树,而不是正则表达式处理器(如PCRE)。实际上,PCRE本身就是一个解析器。
(.*)
并不匹配所有内容(也不匹配
)。已设置,因此它在取消冻结模式下匹配。。。否则,DOM/SimpleXML解析+1…@ircmaxell:你说得对。我错过了
U
修饰符位。谢谢。如果可以的话,我肯定会使用SimpleXml,但我想保持香草味并与PHP4兼容(是的,我知道有点愚蠢^^)。当时我找到的唯一替代方法是xml_解析器,我尝试了它,但最终得到了大量笨拙的代码。一个简单的regexp对我来说更具吸引力,对PHP/module requirements.PHP4的影响更小。
xml\u解析器
方法可能会创建更多的代码,但至少它尊重xml解析器标准。如果您想将XML规范与正则表达式相匹配,您需要做大量的工作,因为这是不可能的。。。此外,我认为再也没有理由考虑PHP4了:它不再受支持了。@tchrist:Regex不是解析器中的关键组件。我使用过的许多解析器(例如libxml)都使用顺序读取来构建解析树,而不是正则表达式处理器(如PCRE)。事实上,PCRE本身就是一个解析器。
$rss_feed = file_get_contents('http://stackoverflow.com/feeds/question/4187945');
$sxml = new SimpleXMLElement($rss_feed);

$title = $sxml->entry[0]->title;
echo $title;