2015-11-30 3 views
-2

У меня есть один массив, который содержит несколько строк. У меня есть другой массив, который содержит также строки, но они короче. Моя цель - проверить, есть ли частичное совпадение в большом массиве для каждого элемента из меньшего массива. Однако preg_match вообще не работает с переменными. Если я помещаю исходный ввод, все кажется прекрасным, но в противном случае результаты будут ложными. Я пробовал почти все возможные комбинации регулярных выражений, но безуспешно. Код примера:Php preg_match не работает с переменной

//Lets say $needle is 3333 and bigPatern has 10 records with 10 digits each, for example third record is 5125433331. I want to perform the partial match and get true 
$needle = $smlPattern[0]; //debugging with first item from smaller array 
$needle2 = "/$needle/"; // I tried [$needle], ^..&, to concatenate and etc 
foreach ($bigPatern as $val) 
{ 
if (preg_match($needle2, $val)) 
{ 
    echo "YES"; 
} 
} 

Любые советы, что я делаю неправильно?

+0

Какова ценность '$ needle' и' $ bigPatern' и '$ val'? Является ли '$ bigPatern' опечаткой. Поместите что-то еще в 'foreach', чтобы проверить поток программы, – dan08

+0

Не могли бы вы предоставить воспроизводимый фрагмент? –

+0

Это работает здесь http://rextester.com/TSNVJ40822 – Mariano

ответ

2

Пожалуйста, избегайте ввода регулярных выражений!

$needle2 = "/".preg_quote($needle,'/')."/"; // 

Не добавляйте вслепую ввод данных пользователя в свое регулярное выражение, сколько по той же причине, что вам нужно, чтобы избежать ввода данных пользователя в запросах SQL. В регулярном выражении самой большой проблемой обычно является проблема ReDoS, где злоумышленник может создать специально созданное регулярное выражение, которое будет использовать часы или более, чтобы выполнить, краду весь процессор с вашего сервера.

+0

Я забыл обрезать вход ... вот в чем проблема. Я читал из файла, и ваш отзыв напомнил мне. Большое спасибо, это решило проблему и дало мне немного больше информации о ReDoS. Мой код на самом деле читается из файла, а выше образец - это просто доказательство концепции, а не фактический код. – tslid

1

Главной ошибкой в ​​вашем примере является использование регулярного выражения для проверки наличия строки. Для этого есть функция strpos.

if (strpos($bigOne, $smallOne) !== false) { 
    echo "bigOne contains smallOne"; 
} 
0

Вы можете даже использовать strpos функцию для достижения той же цели. Он находит позицию первого вхождения подстроки в строке и возвращает false, если совпадение не найдено.

$needle = $smlPattern[0]; 
$needle2 = "needle"; 
foreach ($bigPatern as $val){ 
    if (strpos($val, $needle2) !== false){ 
     echo "YES"; 
    } 
}