Предупреждение: preg_replace (): неизвестный модификатор '[' [duplicate]

0

Скажем, я делаю простую функцию BBCode с использованием регулярного выражения, и я хочу, чтобы тэг [color =] прекратил разбор в первой точке с запятой, чтобы избежать эксплойтов. Теперь я видел этот вопрос во всех stackoverflow, но он никогда не показывает, как его реализовать.

$regex = '/\[colour\=/[^;]*/](.*?)\[\/colour\]/is';
$replace = '<span style="color: $1">$2</span>';

Почему это дает мне ошибку в названии? Я не могу понять регулярное выражение для жизни меня, поэтому я действительно застрял здесь.

Если это помогает, вот оригинальное регулярное выражение, которое я хотел реализовать:

/[^;]*/
  • 0
    Сначала вы всегда должны проверять свое регулярное выражение, например, на regex101.com/#pcre
Теги:

2 ответа

3

Побег косой черты:

$regex = '/\[colour\=\/[^;]*\/](.*?)\[\/colour\]/is';
//            here __^    __^

или используйте другой разделитель:

$regex = '#\[colour=/[^;]*/](.*?)\[/colour\]#is';

Но я думаю, что регулярное выражение:

$regex = '#\[colour=/[^;]*\](.*?)\[/colour\]#is';
//       backslash here __^

В соответствии с заменой:

$regex = '#\[colour=([^;]+)\](.*?)\[/colour\]#is';
$replace = '<span style="color: $1">$2</span>';

Изменить в соответствии с комментарием:

$regex = '#\[colour=(.*?)\](.*?)\[/colour\]#is';
$replace = '<span style="color: $1">$2</span>';
  • 0
    Ни один из них, кажется, не работает. Все они просто делают тег [color] не анализируемым (превращается в html-теги).
  • 0
    «ни один из них не работает» - тогда регулярное выражение ничего не соответствует. Так что начните отладку, чтобы узнать почему.
Показать ещё 5 комментариев
0

Попробуйте этот фрагмент кода:

$text = '[colour=red]Text in red[/colour]';
$regex = '/\[colour=([^;]*)\](.*?)\[\/colour\]/is';
$replace = '<span style="color: $1">$2</span>';

echo preg_replace($regex, $replace, $text);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню