PHP - Pregmatch help - PullRequest
       4

PHP - Pregmatch help

1 голос
/ 02 июня 2011

Я пытаюсь проанализировать список XML-правил PHPIDS (можно загрузить с их сайта http://phpids.org/), по введенному URL-адресу с помощью регулярных выражений XML.

Теперь я очень мало знаю о регулярных выражениях, и яЯ попытался осмотреться, и я не нашел много информации, которая мне показалась бы полезной.

Я хотел бы сделать что-то вроде этого (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 ]

5 голосов
/ 02 июня 2011

О единственном, что я могу сказать, это то, что разделители отсутствуют. Учитывая, что $regex содержит только регулярное выражение, а не часть <![CDATA[, это должно работать:

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

Дайте этому шанс.

0 голосов
/ 21 апреля 2017

Я не вижу, чтобы эта часть когда-либо работала: 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/

...