我正在尝试使用 XML 的正则表达式根据输入的 URL 来解析 PHPIDS 的 XML 规则列表(可在其网站 http://phpids.org/ 下载)。
现在,我对正则表达式知之甚少,我尝试环顾四周,但没有找到太多有用的信息。
我想做的是这样的(伪)
if URL == regex die();
这是我的最新尝试:
$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 don't know why the above is a problem.
如果我能让它工作,我将循环执行规则,但现在我只是尝试 1 个正则表达式来让它工作。
这是从 XML 文件中提取的正则表达式:
<rule><![CDATA[(?:"[^"]*[^-]?>)|(?:[^\w\s]\s*\/>)|(?:>")]]></rule>
虽然我一点也不明白。
我唯一能说的是分隔符丢失了。鉴于
$regex
仅包含正则表达式,而不包含 <![CDATA[
部分,这应该有效:
if(preg_match('#'.$regex.'#',$url2))
尝试一下。
我真的看不出这部分是否有效:
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";
}
输出:
好(空):
坏(双引号更大):">"
坏(美元斜线更大):$/>
坏(大双引号):>"
好(文字):
为了分解您的正则表达式模式并继续学习/实验,我建议:https://regex101.com/