我正在尝试使用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>
虽然我不明白一点......
提前感谢任何可以帮助我的人。
答案 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/