如何让preg_match_all正确匹配每个独立的<script>标签内容?
解决正则匹配多个script标签的问题
你的问题出在正则里的.*是贪婪匹配,它会抓取最长的符合规则的内容,所以从第一个<script>直接匹配到最后一个</script>,把两个标签的内容全部包含进去了。
修正方案
把.*换成.*?(非贪婪匹配),同时如果script标签内的内容包含换行符,需要添加s修饰符让.能匹配换行。修正后的代码如下:
preg_match_all('/<script>(.*?)<\/script>/s', $matches[0], $page_script);
原理说明
.*?是非贪婪匹配,会在找到第一个</script>时就停止当前匹配,从而分别捕获每个独立的script标签内容。s修饰符可以让正则中的.匹配换行符,避免script内容存在换行时出现匹配不全的情况。
执行修正后的代码后,$page_script[0]会得到你期望的结果:
[ 0 => "<script>some_script_data</script>", 1 => "<script>some_more_script_data</script>" ]
额外提示
如果只需要提取script标签内的文本内容,直接访问$page_script[1]即可,它会包含some_script_data和some_more_script_data两个值。
内容的提问来源于stack exchange,提问作者Toma Tomov
相关产品推荐
相关产品推荐

