你好我刚刚遇到PREG_MATCH_ALL()的问题 让我说我有2个字符串...... 拯救你 和 如果上传者名称怎么办? 我需要继续保存你,所以我正在使用以下的模式
preg_match_all('/<span id="title.*">(.*)<\/span>/i',,);
因此我得到了
救你 上传者名称
我认为这是因为它采取了最后一种方法来解决它?或者喜欢匹配第一个?谢谢
编辑:
<a href="#" onclick="searchActions.showLyrics('14840_100733666_21',9965243); return false;">Can't Keep My Hands Off You</a></span>
得到结果
<a href="Your Love Is A Lie"</a>
带
/<span id="title(.*?)">(.*?)<\/span>/i
答案 0 :(得分:2)
原因是.*
贪婪。第一个.*
(在title
之后)会吞下尽可能多的字符,然后从字符串的末尾开始回溯,直到正则表达式的其余部分匹配为止。
要修复它,请使用ungreedy版本.*?
和/或将.
替换为某些与引号不匹配的字符类(例如[^"]
):< / p>
preg_match_all('/<span id="title[^"]*">(.*?)<\/span>/i', ..., ...);
有关详细信息,请参阅http://www.php.net/manual/en/regexp.reference.repetition.php
(Ps.Levi Morrison是对的 - 这不是解析HTML的好方法。使用真正的HTML解析器,例如DOMDocument::loadHTML()
。)