从 XML 文件中提取 CDATA 内容

问题描述 投票:0回答:2

我正在尝试使用 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>

虽然我一点也不明白。

php regex xml preg-match text-extraction
2个回答
5
投票

我唯一能说的是分隔符丢失了。鉴于

$regex
仅包含正则表达式,而不包含
<![CDATA[
部分,这应该有效:

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

尝试一下。


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";
}

输出:

好(空):
坏(双引号更大):">"
坏(美元斜线更大):$/>
坏(大双引号):>"
好(文字):

为了分解您的正则表达式模式并继续学习/实验,我建议:https://regex101.com/

© www.soinside.com 2019 - 2024. All rights reserved.