Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_代替地狱_Php_Preg Replace - Fatal编程技术网

Php preg_代替地狱

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\"\&

我试图使用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\"\>(.*)\</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中指定为
    header2
    ,但在示例HTML中指定为
    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);