【发布时间】:2012-08-18 18:36:42
【问题描述】:
$regex = '#<p.+</p>#s';
我的目标是返回出现在第一个段落标记和最后一个段落标记之间的大字符串。这是包括所有内容,甚至是其他段落。
我上面的正则表达式适用于除段落标签之外的所有内容。我测试了它用'html'替换'p'并返回成功,替换为'script'并返回成功......为什么这对于这些情况会返回true而不是对于段落?
我仍在努力,并且相对确信没有奇怪的转义序列导致正则表达式停止......我认为这是因为我可以提取第一个和最后一个“html”标签之间的所有内容。 “html”标签之间的文本还包含我未能提取的所有“p”标签。如果存在某种转义或错误,我认为在提取“html”标签时也会引发相同的错误。我试过 preg_quote() 没有成功。
也许我需要将专用于正则表达式处理的内存设置得更高,以便它可以处理整个文档?
更新:在大多数情况下,前导“p”将(在大多数情况下)不是同一段落标签的结束“/p”标签。
更新:返回的结果类似于:
<p>this is the first tag</p>this is a bunch of text from the document, could be all manner of tags <p>this is the last paragraph tag</p>
更新:代码示例
$htmlArticle = <<< 'ENDOFHTML'
Insert data from pastebin here
http://pastebin.com/4A3FYGc8
ENDOFHTML;
$pattern = '#<html.+/html>#s'; // Works fine, returns all characters between first <html and last /html
$pattern = '#<script.+/script>#s'; // Works fine, same as above
$pattern = '#<p.+/p>#s'; // Returns nothing, nothing at all. :'(
preg_match($pattern, $htmlArticle, $matches);
var_dump($matches);
?>
解决方案: ini_set('pcre.backtrack_limit', '1000000');
我已经用尽了我的回溯限制。这是 php.ini 文件中的设置,可以使用 ini_set() 在代码中设置。奇怪的是,我用 ini_set() 设置了值以匹配我的 php.ini 文件中的值......所以它应该从一开始就工作。 --- 感谢您尽快发布解决方案。
【问题讨论】:
-
我不想将 html 解析为有意义的值。我只想提取第一次出现的“
”之间的任何文本。例如,我将对返回的文本进行哈希处理,并使用它来加密某些内容。返回的文本到底是什么,我不关心,只要我得到它。
-
除非您提供实际的详细信息,否则您不会收到有意义的答案。比如实际的匹配结果是什么。
-
在大多数情况下,前导“
”将(在大多数情况下)不是同一段落标签的结束“
”标签。 -
也许你需要再解释一下。结果正是您的正则表达式应该返回的结果,所有内容都在文档末尾的第一个
<p>和</p>之间,或者不是?