正则表达式跨行匹配问题求助:起始与结束标签分属不同行
解决跨多行正则匹配HTML标签的问题
首先,你的正则表达式在标签跨多行时失效,主要原因是默认情况下正则的.元字符不会匹配换行符,而且如果不使用非贪婪匹配,很容易出现过度匹配的问题。针对你的需求,我们可以这样调整正则:
修正后的正则代码
preg_match_all('/<p class="psku">(.*?)<\/span><\/p>/s', $string, $info);
关键调整点:
/s修饰符:这个修饰符会让.匹配包括换行符在内的所有字符,完美解决起始和结束标签在不同行的问题。.*?非贪婪匹配:使用*?代替*,确保正则只会匹配到最近的</span></p>结束标签,而不是从第一个起始标签一直匹配到最后一个结束标签,避免过度抓取内容。
额外提醒:用正则解析HTML的局限性
虽然正则可以解决简单的HTML匹配需求,但HTML的结构往往是嵌套、不规则的(比如属性顺序变化、额外空格、自闭合标签等),正则很容易出现匹配错误。更可靠的方式是用PHP的DOM扩展来解析:
比如,如果你的目标是提取<p class="psku">内的内容(假设实际内容里包含<span>),可以这样写:
$dom = new DOMDocument(); // 忽略HTML解析警告(针对不规范的HTML) libxml_use_internal_errors(true); $dom->loadHTML($string); libxml_clear_errors(); $xpath = new DOMXPath($dom); // 匹配所有class为psku的p标签,然后提取内部文本 $pskuElements = $xpath->query('//p[@class="psku"]'); $info = []; foreach ($pskuElements as $elem) { $info[] = trim($elem->textContent); }
这种方法能更好地处理复杂的HTML结构,不会因为换行、空格或者标签嵌套而出错。
内容的提问来源于stack exchange,提问作者Temporary-Failure
相关产品推荐
相关产品推荐

