Сопоставление наборов тегов в PHP с регулярным выражением
В настоящее время я работаю над защитой моего AJAX-чата от эксплойтов, проверяя весь текст в PHP перед его передачей клиенту. До сих пор я успешно справлялся со своей миссией, за исключением одной части, где мне нужно сопоставлять наборы тегов изображений.
В целом, я бы хотел, чтобы он обнаружил наличие символа новой строки между наборами тегов, которым я управлял, но решение, которое у меня есть, является жадным и также соответствует символам новой строки вне тегов, если существует несколько наборов тегов.,
На данный момент у меня есть следующее, которое работает, если я хотел просто соответствовать [img]{newline}[/img]
if(preg_match('/\[\bimg\].*\x0A.*\[\/\bimg\]/', $text)){ //code }
Но если бы я хотел сделать [img]image.jpg[/img]{newline}[img]image.jpg[/img]
, он видит только самые первые и конечные теги, которые я не хочу.
Итак, теперь я спрашиваю, как сделать так, чтобы он соответствовал каждому набору тегов?
Изменить: для уточнения. Любые символы новой строки внутри тегов плохие, поэтому я хочу их обнаружить. Любые символы новой строки вне тегов хороши, и я хочу их игнорировать. Причина в том, что, если клиент обрабатывает символ новой строки внутри тега, происходит сбой.
2 ответа
Просто сделайте это несгибаемым, поставив ?
после двух .*
Но обратите внимание, что ваше текущее решение не будет соответствовать этому:
[img]
look, two newlines!
[/img]
Я не уверен, почему вы хотите это сделать, но вы можете сделать .
сопоставлять переводы строк, добавляя s
модификатор вашего регулярного выражения. Тогда это просто "(\[img\](.*?)\[/img\])is"
сопоставить его, и вы даже можете захватить эту группу и по отдельности проверить ее на наличие новых строк, если хотите.
Попробуйте установить модификатор s следующим образом:
if (preg_match('/\[\bimg\].*\x0A.*\[\/\bimg\]/s', $text)) { code }
Смотрите также документацию PHP для модификаторов Regex