Сопоставление наборов тегов в 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

Другие вопросы по тегам