PHP - Preg_match帮助

时间:2011-06-01 21:04:23

标签: php regex preg-match

我正在尝试使用XML的正则表达式对输入的URL解析PHPIDS的XML规则列表(可在其站点http://phpids.org/下载)。

现在,我对正则表达式知之甚少,而且我已经尝试过环顾四周,而且我没有找到有关它的更多信息,我发现它有用。

我想做的是这样的事情(psuedo) 如果URL == regex die();

这是我最近的一次尝试:

<?php
$file="default_filter.xml";
$load = simplexml_load_file($file);

$regex = $load->filter->rule;
$url = explode(" ","http://localhost/test.php");
$url2 = "http://localhost/test.php";
if(in_array($regex,$url))
{
echo "bad url";
}
if(preg_match($regex,$url2))
{
echo "bad url";
}
//The above gives me Warning: preg_match() [function.preg-match]: Unknown modifier '|' in C:\wamp\www\test.php on line 12
//Which, already i don't understand regex so i dont know why the above is a problem...
?>

如果我可以让它工作,我会循环规则,但现在我只是尝试1个正则表达式来使它工作。

但是我无法弄清楚是否正在使用正则表达式。

这是从XML文件中提取的正则表达式:

<rule><![CDATA[(?:"[^"]*[^-]?>)|(?:[^\w\s]\s*\/>)|(?:>")]]></rule>

虽然我不明白一点......

提前感谢任何可以帮助我的人。

2 个答案:

答案 0 :(得分:5)

我唯一可以说的是delimiters遗失了。鉴于$regex仅包含正则表达式,而不包含<![CDATA[部分,这应该有效:

if(preg_match('#'.$regex.'#',$url2))

试一试。

答案 1 :(得分:0)

我无法真正看到这部分工作:if(in_array($regex,$url)){echo "bad url";} 我不确定你要用条件陈述来实现什么。

至于从XML规则中提取正则表达式模式,我可以通过以下测试代码为您提供一些指导:

$inputs=array(
  "empty"=>'',
  "doublequote-greater"=>'">"',  // first regex condition match
  "dollar-slash-greater"=>'$/>', // second regex condition match
  "greater-doublequote"=>'>"',  // third regex condition match
  "text"=>'<a>'
);
$rule='<rule><![CDATA[(?:"[^"]*[^-]?>)|(?:[^\w\s]\s*\/>)|(?:>")]]></rule>';
$regex=(preg_match("/<rule><!\[CDATA\[\K.*?(?=\]\])/",$rule,$match)?"/$match[0]/":FALSE);

if($regex){
    foreach($inputs as $k=>$v){
        if(preg_match($regex,$v)){
            echo "Bad ($k): $v\n";
        }else{
            echo "Good ($k): $v\n";
        }
    }
}else{
    echo "Failed to extract regex pattern from XML rule: $rule";
}

输出:

  

好(空):
  坏(doublequote-greater):“&gt;”
  坏(美元斜线更大):$ /&gt;
  坏(大双引号):&gt;“
  好(文字):

为了打破你的正则表达式模式并继续学习/试验,我建议:https://regex101.com/