Php preg_代替地狱
我试图使用preg_replace从远程页面获取一些数据,但在整理模式时遇到了一些问题Php preg_代替地狱,php,preg-replace,Php,Preg Replace,我试图使用preg_replace从远程页面获取一些数据,但在整理模式时遇到了一些问题 function getData($Url){ $str = file_get_contents($Url); if(strlen($str)>0){ preg_match("/\<span class=\"SectionHeader\"\>title\</span>/<br/>/\<div class=\"header2\"\&
function getData($Url){
$str = file_get_contents($Url);
if(strlen($str)>0){
preg_match("/\<span class=\"SectionHeader\"\>title\</span>/<br/>/\<div class=\"header2\"\>(.*)\</div\></span\>/",$str,$title);
return $title[1];
}
}
函数getData($Url){
$str=文件获取内容($Url);
如果(strlen($str)>0){
预匹配(“/\title\//\(.*)\/”,$str,$title); 返回$title[1]; } } 这里是HTML,就像我在它上面扔了一百万个斜杠之前一样(看起来我忘了一两部分):
mytitle
事件名称
其中,事件名称是我希望在函数中返回的数据
多谢各位,这真是个麻烦事。虽然我倾向于同意评论者的看法,认为这不是一个很好的解决方案,但以下是我对你们声明未经测试的修订:
preg_match('#\<span class="SectionHeader"\>title\</span\>/\<br/\>/\<div class="header2"\>(.*)\</div\>\</span\>#',$str,$title);
preg\u匹配('\\\title\/\/\(.*)\\\\\\\',$str,$title);
我将双引号字符串更改为单引号字符串,因为您没有使用双引号字符串的任何变量替换功能,这避免了反斜杠转义双引号,也避免了反斜杠的任何歧义(可能应该加倍以生成正确的字符串,请参阅)。我将斜杠/分隔符更改为散列#,因为匹配模式中出现了大量斜杠(其中一些在您的版本中没有反斜杠转义)。表达式有很多地方不对劲:
- 您正在使用
作为分隔符,但随后在不同的位置使用/
取消scaped/
- 您正在逃逸
,这似乎是随机的。他们根本不应该逃脱 - 由于某种原因,你在
周围有一些流氓/
- div的类名在regex中指定为
,但在示例HTML中指定为header2
Center
- HTML中的标题是
,正则表达式中的标题是mytitle
title
preg_match('(<span class="SectionHeader">mytitle</span><br/><div class="Center">(.*)</div\></span\>)',$data,$t);
preg_match('(mytitle
(.*)),$data,$t);
如果你想匹配任何标题而不是特定的标题
mytitle
,只要用*?
替换即可,我不会用一根十英尺长的杆子来碰它。必须有一种比扫描整个页面寻找匹配项更有效的方法来获取标题。你知道preg_match会返回一个数组,如果它为该条件找到了多个匹配项,对吗?我会使用html解析器,就像以前很多次一样,所以我建议不要使用正则表达式来解析html,因为它们不适合这样做。改用HTML解析器。
preg_match('(<span class="SectionHeader">mytitle</span><br/><div class="Center">(.*)</div\></span\>)',$data,$t);